Explore media metadata publishing and playback interactions
Media & Web 进阶 20m

探索媒体元数据发布与播放交互

Explore media metadata publishing and playback interactions

2022年6月6日

在 Apple 官方观看视频

一句话判断

如果你的 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 的场景(比如自定义音频引擎),可以通过 MPNowPlayingInfoCenternowPlayingInfo 字典手动发布元数据。需要定期更新进度信息。

代码片段

// 创建 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