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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值