Media & Web 进阶 20m
探索媒体元数据发布与播放交互
Explore media metadata publishing and playback interactions
2022年6月6日
一句话判断
如果你的 App 播放音视频内容,MPNowPlayingSession 是你接入控制中心、锁屏、Apple Watch 等全平台播放控制的关键——而且 iOS 16 终于引入了自动元数据发布。
这场 Session 讲了什么
Apple 生态中有大量展示”正在播放”信息的界面:控制中心、锁屏、Apple Watch 的 Now Playing App、tvOS 的信息叠加层、以及通过 AirPlay 控制其他设备。正确发布元数据并响应远程控制命令,让你的用户在任何地方都能控制播放。
Session 围绕 MPNowPlayingSession 展开。这个类在 tvOS 上已经存在,iOS 16 正式引入。它代表一个独立的播放会话,支持多会话场景(比如画中画)。如果你的 App 使用 AVKit,元数据发布是全自动的。如果直接使用 AVFoundation,iOS 16 也提供了自动发布能力——只要正确配置了 MPNowPlayingSession。
远程命令响应部分覆盖了播放/暂停、跳进/跳退、快进/快退等常见控制,以及如何在特定场景下临时禁用某些命令(比如广告期间禁止跳过)。
值得深挖的点
- 自动元数据发布:iOS 16 和 tvOS 16 的新功能。只要你的播放器通过
MPNowPlayingSession关联,系统会自动从 AVPlayerItem 提取标题、艺术家、封面等信息并发布到所有”Now Playing”界面。这大大减少了手动发布的代码量。 - 多会话管理:如果你的 App 支持画中画,应该创建两个
MPNowPlayingSession,分别对应主播放器和画中画播放器。通过becomeActiveIfPossible方法切换活跃会话。系统会根据活跃会话更新所有”Now Playing”界面。 - Now Playing 资格判定:App 必须满足两个条件才能成为”Now Playing” App——注册至少一个远程命令处理器,且 AVAudioSession 配置为 non-mixable 类别。这是系统层面的硬性要求。
- 手动元数据发布:对于不使用 AVFoundation 的场景(比如自定义音频引擎),可以通过
MPNowPlayingInfoCenter的nowPlayingInfo字典手动发布元数据。需要定期更新进度信息。
代码片段
// 创建 MPNowPlayingSession 并注册远程命令
let player = AVPlayer(url: streamURL)
let session = MPNowPlayingSession(players: [player])
// 注册播放/暂停命令
let commandCenter = session.remoteCommandCenter
commandCenter.playCommand.addTarget { event in
player.play()
return .success
}
commandCenter.pauseCommand.addTarget { event in
player.pause()
return .success
}
// 跳进/跳退命令
commandCenter.skipForwardCommand.preferredIntervals = [15]
commandCenter.skipForwardCommand.addTarget { event in
guard let event = event as? MPSkipIntervalCommandEvent else {
return .commandFailed
}
let newTime = player.currentTime() + CMTime(seconds: event.interval, preferredTimescale: 1)
player.seek(to: newTime)
return .success
}
// 在广告期间临时禁用跳过功能
commandCenter.skipForwardCommand.isEnabled = false
// 广告结束后重新启用
commandCenter.skipForwardCommand.isEnabled = true
最佳实践
- 为你支持的每一个远程命令注册处理器,不要遗漏——不支持的命令可以禁用
- 实时媒体(直播流)应该禁用跳进命令,但可以保留快进/快退
- 多会话场景下,始终确保只有一个活跃的 Now Playing 会话
- 定期更新
nowPlayingInfo中的elapsedPlaybackTime,让锁屏进度条保持准确 - 使用
MPNowPlayingSession而非直接操作MPNowPlayingInfoCenter,前者提供了更完整的会话管理
还有什么值得关注
- “What’s new in AVFoundation” 包含了 AVKit 自动发布机制的底层细节
- “Bring Continuity Camera to your macOS app” 与本 Session 同属媒体体验改进系列
- tvOS 上的 AVKit 有独立的自动发布机制,与 iOS 不完全相同
- 如果你的 App 支持 AirPlay,远程命令处理和元数据发布直接影响 AirPlay 控制体验
WWDC 2022