iOS15系统下AirPods Pro无法播放音频的故障排查及解决方案问询
问题根本原因
这是iOS15系统的已知原生bug,和AirPods Pro的蓝牙音频路由校验逻辑相关:
- iOS15重构了AirPods Pro的音频元数据同步逻辑,会将App的产品名、锁屏播放信息打包同步到耳机端做验证,当
Product Name包含空格(多单词)时,系统生成的同步报文编码异常,AirPods Pro收到后会判定该音频会话无效,直接切断音频输出 - 其余型号AirPods和扬声器不受影响是因为:普通AirPods没有该元数据校验逻辑,扬声器不需要走蓝牙路由的元数据校验流程
- 删除
setupMediaPlayerNotificationView(true)后恢复正常,是因为跳过了锁屏播放控制的注册,不会触发耳机端的元数据校验流程
修复方案
快速修复方案
直接修改Xcode中Build Settings -> Product Name为不含空格的单个单词,无需修改业务代码即可正常使用全部功能。
保留多单词产品名的兼容方案
如果需要保留多单词的产品名,修改两处代码即可规避bug:
- 主动配置AVAudioSession的路由规则,在App启动/音频模块初始化时添加以下代码:
do { try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.allowBluetooth, .allowBluetoothA2DP, .allowAirPlay]) try AVAudioSession.sharedInstance().setActive(true) } catch { print(error.localizedDescription) }
- 调整原有播放逻辑的执行顺序,先注册锁屏控制再初始化播放音频:
let url = Bundle.main.url(forResource: "\(masterIndex)0", withExtension: "m4a")! do { // 先注册锁屏控制,再初始化音频播放器 setupMediaPlayerNotificationView(true) lockScreen() audioPlayer = try AVAudioPlayer(contentsOf: url) audioPlayer.delegate = self audioPlayer.prepareToPlay() play(sender:AnyObject.self as AnyObject) } catch { print(error.localizedDescription) }
内容的提问来源于stack exchange,提问作者user13667410
相关产品推荐
相关产品推荐

