用 AirPods 增强应用的音频体验
Enhance your app's audio experience with AirPods
2023年6月5日
一句话判断
iOS 17 和 macOS 14 为 AirPods 带来了三项面向开发者的新能力——自动设备切换的可感知性、AirPods 按键静音/取消静音回调、以及个性化空间音频(Personalized Spatial Audio)的进一步优化。
这场 Session 讲了什么
Session 介绍了 AirPods 在 iOS 17 和 macOS 14 中的新特性及其对开发者的影响。
自动设备切换的优化。当用户戴着 AirPods 从 iPhone 切换到 Mac 时(比如接听 Mac 上的视频会议),系统会显示 “AirPods Connected” 横幅,确认连接已完成。音乐会在切换时自动暂停,会议音频从 AirPods 播放。这个流程对开发者来说是透明的,但你的 App 可以通过 AVAudioSession 的路由变更通知来响应。
AirPods 按键静音。用户按下 AirPods 杆部可以静音/取消静音会议通话。这个操作会在屏幕上显示麦克风状态横幅和音频提示。开发者可以通过 AVAudioSession 的 isInputMuted 属性监听静音状态变化,或者在媒体会话中处理 Mute 命令。
个性化空间音频。iOS 16 引入的个性化空间音频在 iOS 17 中进一步优化。用户的个性化配置通过 iCloud 同步到所有设备。如果你的 App 使用 AVFoundation 的空间音频能力,用户会自动获得个性化体验。
值得深挖的点
静音回调的实现方式:AirPods 静音键触发的是系统的音频路由变更。你的 App 需要监听 AVAudioSession.isInputMuted 变化或 MPRemoteCommandCenter 的 muteCommand 来响应。不处理的话,系统会自动切换麦克风状态,但你的 App UI 可能不会同步更新。
跨设备场景的音频会话管理:当 AirPods 从 iPhone 切换到 Mac 时,iPhone 端的音频会话会被中断。你的 App 需要正确处理 AVAudioSessionInterruptionNotification,在音频恢复时无缝继续播放。
空间音频对 App 的要求:如果你的内容使用多声道或 Dolby Atmos 编码,AVFoundation 会自动应用空间音频渲染。不需要额外 API 调用。
代码片段
监听 AirPods 静音状态变化:
import AVFoundation
// 监听静音状态变化
NotificationCenter.default.addObserver(
forName: AVAudioSession.isInputMutedChangeNotification,
object: nil,
queue: .main
) { notification in
// 获取当前静音状态
let isMuted = AVAudioSession.sharedInstance().isInputMuted
// 更新 UI 中的麦克风状态指示器
updateMuteButton(isMuted: isMuted)
}
// 或者通过 MPRemoteCommandCenter 处理
import MediaPlayer
let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.muteCommand.addTarget { event in
// 用户按下了 AirPods 静音键
toggleMute()
return .success
}
最佳实践
- 监听
isInputMutedChangeNotification确保 App UI 与实际静音状态同步 - 正确处理音频会话中断和恢复,确保跨设备切换时体验无缝
- 使用多声道/杜比全景声编码的内容自动获得空间音频增强
- 不要假设音频输出设备始终是 AirPods——检查
currentRoute获取实际设备 - 在通话类 App 中显示麦克风状态指示器,让用户知道静音操作已生效
还有什么值得关注
- 个性化空间音频的校准流程和用户隐私
- 第三方耳机对静音按键和空间音频的支持情况
- macOS 上 AirPods 自动切换的延迟和可靠性
- 蓝牙带宽对空间音频质量的影响