刘浩的技术博客

就当是做个笔记,顺便分享一些知识,更希望业界的交流

Event Handling Guide之Remote Control Events

远程控制事件是用户去控制你的APP多媒体的一种方法。远程控制事件源于外部附件或者来自通过系统显示的传输控制并通过Media Player framework的类交付到你的APP。APP播放音视频内容使用这些事件去开始和停止播放,改变轨迹,甚至快进一个项(rate an item)。所有的媒体APP都应该支持这些事件。

除了支持远程控制事件,APP可以使用Media Player framework去提供播放的轨迹信息。系统在适当的位置显示播放信息,例如锁屏界面和控制中心。

更多关于Media Player framework的类的信息,看Media Player Framework Reference

准备你的APP的远程控制事件

去接收远程控制事件,做以下几点:

  • 注册你支持的每一个action的处理者。使用共享的MPRemoteCommandCenter对象去注册不同事件类型的处理者,详细描述在Handling Remote Control Events里面。
  • 开始播放音频(audio)。你的APP必须是"现在播放"(“Now playing”)的APP。APP直到它开始播放音频才接收远程控制事件。

如果你的APP还提供了包含当前轨迹信息的正在播放的信息,使用MPNowPlayingInfoCenter对象在适当的时间去更新这个信息。更多关于如何去提供现在播放信息,看Providing Now Playing Information

处理远程控制事件(Handling Remote Control Events)

处理一个特定的远程控制事件,与适当的MPRemoteCommand对象注册一个action操作者。Media Player framework定义一个标准MPRemoteCommand对象集合对于处理媒体相关的事件。当一个附件或者iOS接口生成一个远程控制事件时,系统通知相应的MPRemoteCommand对象。这个对象通过执行任何附加的处理程序响应。

你从共享的MPRemoteCommandCenter对象检索远程命令对象。远程命令中心属性包含管理播放对象,切换轨道,和为轨道评级(rating the track)。获取你想去支持的对象,使用一个block或者一个action方法附加一个处理程序。通常,你为每一个命令类型注册一个单个处理程序,如果你需要你也可以注册多个处理程序。以下代码显示当用户想播放一个轨道时如何去注册一个block被执行。在这个例子里,block使用一个自定义的播放对象播放当前选中的音轨。在你的代码里面,执行你需要去播放这个音轨的任何动作。

1
2
3
4
5
MPRemoteCommandCenter *commandCenter = [MPRemoteCommandCenter sharedCommandCenter];
[commandCenter.playCommand addTargetUsingBlock:^(MPRemoteCommandEvent *event) {
    // Begin playing the current track.
    [[MyPlayer sharedPlayer] play];
}

如果你明确不想去支持一个给定的命令,获取这个命令对象并设置它的enabled属性到NO。当你的APP是现在演示的APP时禁用一个远程命令让系统知道它不应该显示任何相关的UI。

一些命令对象让你指定与该命令有关的其它的信息。例如,反馈命令让你指定一个描绘反馈意义的本地字符串。一定要查看参考文档,了解您所支持的特定命令的信息。

对于远程控制命令处理程序的添加和移除的更多信息,看MPRemoteCommand Class Reference

提供正在播放的信息(Providing Now Playing Information)

当播放audio或者video内容时,使用MPNowPlayingInfoCenter对象去提供关于这个内容正在播放的描述信息。MPNowPlayingInfoCenter对象包含一个nowPlayingInfo字典,它的内容描述了正在播放的项目。系统在适当的地方显示字典的信息,例如设备的锁定屏幕。

以下代码显示一个关于如何使用在MPMediaItem里面的信息去配置正在播放的信息的例子。这个例子枚举一组固定的属性,使用结果值去构建一个新的字典这个是接下来分配给MPNowPlayingInfoCenter对象的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- (void)configureNowPlayingInfo:(MPMediaItem*)item
{
    MPNowPlayingInfoCenter* info = [MPNowPlayingInfoCenter defaultCenter];
    NSMutableDictionary* newInfo = [NSMutableDictionary dictionary];
    NSSet* itemProperties = [NSSet setWithObjects:MPMediaItemPropertyTitle,
          MPMediaItemPropertyArtist,
          MPMediaItemPropertyPlaybackDuration,
          MPNowPlayingInfoPropertyElapsedPlaybackTime,
          nil];

    [item enumerateValuesForProperties:itemProperties
          usingBlock:^(NSString *property, id value, BOOL *stop) {
        [newInfo setObject:value forKey:property];
    }];

    info.nowPlayingInfo = newInfo;
}

NOTE:在iOS模拟器里面,在你的nowPlayingInfo字典里总是包含了MPNowPlayingInfoPropertyPlaybackRate键。模拟器使用这个键值去更新显示在控制中心和另外的基于模拟器界面里面的播放进度。对于暂停或者停止的音轨设置这个键值为0。对于一个正在播放的音轨设置这个值为一个正数。

更多关于你可以提供的信息类型,看MPNowPlayingInfoCenter Class Reference

在设备测试远程控制事件

测试你的APP接收和处理与控制中心的远程控制事件是正确的,你通过上滑你屏幕的边缘请求。这些控制发送远程控制事件到当前或者是最近播放音频的APP。你也可以在设备的锁定屏幕请求播放控制。