IOS Audio RemoteControl

简介:

RemoteControl
RemoteComtrol可以用来在不打开app的情况下控制app中的多媒体播放行为,涉及的内容主要包括:
1、锁屏界面双击Home键后出现的播放操作区域
2、iOS7之后控制中心的播放操作区域
3、iOS7之前双击home键后出现的进程中向左滑动出现的播放操作区域
4、AppleTV,AirPlay中显示的播放操作区域
5、耳机线控

6、车载系统的设置


RemoteControl的处理,根据官方文档说明,需要满足三个条件:

1、接收者必须可以成为第一响应者;

2、接收者必须显示声明接收RemoteControl事件;

3、App必须是Now Playing App.


对于第一种,我们给UIApplication添加一个扩展:

//
//  UIApplication+RemoteControl.h
//  IOSAudioRemoteControl
//
//  Created by huangyibiao on 15/3/25.
//  Copyright (c) 2015年 huangyibiao. All rights reserved.
//

#import <UIKit/UIKit.h>

// 播放
extern NSString *kRemoteControlPlayTapped;
// 暂停
extern NSString *kRemoteControlPauseTapped;
// 停止
extern NSString *kRemoteControlStopTapped;
// 前一首
extern NSString *kRemoteControlPreviousTapped;
// 后一首
extern NSString *kRemoteControlNextTapped;
// 其它
extern NSString *kRemoteControlOtherTapped;

@interface UIApplication (RemoteControl)

/**
 *  注册对remote control事件的监听
 *
 *  @param observer 监听者
 *  @param selector 回调
 */
- (void)observeRemoteControl:(id)observer selector:(SEL)selector;

@end

//
//  UIApplication+RemoteControl.m
//  IOSAudioRemoteControl
//
//  Created by huangyibiao on 15/3/25.
//  Copyright (c) 2015年 huangyibiao. All rights reserved.
//

#import "UIApplication+RemoteControl.h"

const NSString *kRemoteControlPlayTapped = @"kRemoteControlPlayTapped";
const NSString *kRemoteControlPauseTapped = @"kRemoteControlPauseTapped";
const NSString *kRemoteControlStopTapped = @"kRemoteControlStopTapped";
const NSString *kRemoteControlPreviousTapped = @"kRemoteControlForwardTapped";
const NSString *kRemoteControlNextTapped = @"kRemoteControlBackwardTapped";
const NSString *kRemoteControlOtherTapped = @"kRemoteControlOtherTapped";

@implementation UIApplication (RemoteControl)

- (BOOL)canBecomeFirstResponder {
  return YES;
}

- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
  switch (event.subtype) {
    case UIEventSubtypeRemoteControlPlay:
      [self postNotification:kRemoteControlPlayTapped];
      break;
      case UIEventSubtypeRemoteControlPause:
      [self postNotification:kRemoteControlPauseTapped];
      break;
    case UIEventSubtypeRemoteControlStop:
      [self postNotification:kRemoteControlStopTapped];
      break;
      case UIEventSubtypeRemoteControlNextTrack:
      [self postNotification:kRemoteControlNextTapped];
      break;
      case UIEventSubtypeRemoteControlPreviousTrack:
      [self postNotification:kRemoteControlPreviousTapped];
      break;
    default:
      [self postNotification:kRemoteControlOtherTapped];
      break;
  }
}

- (void)postNotification:(const NSString *)notificationName {
  [[NSNotificationCenter defaultCenter]
   postNotificationName:(NSString *)notificationName object:nil];
}

- (void)observeRemoteControl:(id)observer selector:(SEL)selector {
  NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
  
  [center addObserver:observer selector:selector name:(NSString *)kRemoteControlNextTapped object:nil];
  
  [center addObserver:observer selector:selector name:(NSString *)kRemoteControlPauseTapped object:nil];

  [center addObserver:observer selector:selector name:(NSString *)kRemoteControlStopTapped object:nil];
  
  [center addObserver:observer selector:selector name:(NSString *)kRemoteControlPreviousTapped object:nil];
  
  [center addObserver:observer selector:selector name:(NSString *)kRemoteControlPlayTapped object:nil];
  
  [center addObserver:observer selector:selector name:(NSString *)kRemoteControlOtherTapped object:nil];
}

@end

下面来测试一下:

#import "ViewController.h"
#import <MediaPlayer/MPNowPlayingInfoCenter.h>
#import "UIApplication+RemoteControl.h"
#import <AVFoundation/AVFoundation.h>

@interface ViewController () {
  UITextView *_textView;
  AVPlayer   *_player;
}

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  
  _textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 40, self.view.bounds.size.width, self.view.bounds.size.height - 40)];
  _textView.autocapitalizationType = UITextAutocapitalizationTypeNone;
  _textView.textAlignment = NSTextAlignmentLeft;
  _textView.textColor = [UIColor redColor];
  _textView.backgroundColor = [UIColor lightGrayColor];
  [self.view addSubview:_textView];
  _textView.editable = NO;
  
  _textView.text = @"操作remote control,会在这里显示出来所执行的操作记录。。。\n";
  
  [[UIApplication sharedApplication] observeRemoteControl:self
                                                 selector:@selector(onRemoteControlNotification:)];
  
  _player = [[AVPlayer alloc] initWithURL:[NSURL URLWithString:@"http://stream.jewishmusicstream.com:8000"]];
  [_player play];
}

- (void)onRemoteControlNotification:(NSNotification *)notification {
  if ([notification.name isEqualToString:kRemoteControlPlayTapped]) {
    [self showLog:@"remote control play event"];
    [_player play];
  } else if ([notification.name isEqualToString:kRemoteControlPauseTapped]) {
    [self showLog:@"remote contrl pause event"];
    [_player pause];
  } else if ([notification.name isEqualToString:kRemoteControlNextTapped]) {
    [self showLog:@"remote control play next event"];
  } else if ([notification.name isEqualToString:kRemoteControlPreviousTapped]) {
    [self showLog:@"remote control play previous event"];
  } else if ([notification.name isEqualToString:kRemoteControlStopTapped]) {
    [self showLog:@"remote control stop event"];
    [_player pause];
  } else if ([notification.name isEqualToString:kRemoteControlOtherTapped]) {
    [self showLog:@"remote control other event"];
  }
}

- (void)showLog:(NSString *)text {
  _textView.text = [NSString stringWithFormat:@"%@\n%@", _textView.text, text];
}

@end

获取Demo: https://github.com/632840804/IOSAudioRemoteControl


目录
相关文章
|
iOS开发 设计模式 API
iOS Audio unit(音频单元)详解 关于音频单元托管
iOS Audio unit(音频单元)详解 关于音频单元托管 iOS  提供的音频处理插件支持混合,均衡,格式转换以及录制,回放,离线呈现和实时对话(如VoIP(互联网语音协议))的实时输入/输出。
2024 0
|
缓存 iOS开发
iOS Audio(音频)
1. 播放音效 #pragma mark 基本使用 - (void)baseUse { //1. 创建URL地址 NSURL *url = [[NSBundle mainBundle] URLForResource:@"buyao.
926 0
|
1月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
92 3
|
3月前
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
122 2
|
3月前
|
存储 数据建模 数据库
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
40 0
|
3月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
93 2
|
3月前
|
API 开发工具 iOS开发
iOS 开发高效率工具包:10 大必备工具
iOS 开发高效率工具包:10 大必备工具
48 1
|
3月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
54 1
|
10天前
|
API 定位技术 iOS开发
IOS开发基础知识:什么是 Cocoa Touch?它在 iOS 开发中的作用是什么?
【4月更文挑战第18天】**Cocoa Touch** 是iOS和Mac OS X应用的核心框架,包含面向对象库、运行时系统和触摸优化工具。它提供Mac验证的开发模式,强调触控接口和性能,涵盖3D图形、音频、网络及设备访问API,如相机和GPS。是构建高效iOS应用的基础,对开发者至关重要。
12 0