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(互联网语音协议))的实时输入/输出。
2112 0
|
缓存 iOS开发
iOS Audio(音频)
1. 播放音效 #pragma mark 基本使用 - (void)baseUse { //1. 创建URL地址 NSURL *url = [[NSBundle mainBundle] URLForResource:@"buyao.
963 0
|
19天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
6天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
10天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
12天前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
15天前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!
|
20天前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
23 2
|
27天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
45 9