设置AVAudioSession playback类别的App中断其他App音频的解决方法
解决方案
问题出在你启动应用时就直接激活了playback类别的音频会话——playback类别默认会抢占系统音频焦点,所以会直接中断其他正在播放的应用音频。要实现「后台播放自身音频 + 不播放时不干扰其他应用」,核心是按需激活/停用音频会话,而不是启动就抢占。
具体调整步骤:
移除启动时的音频会话激活逻辑
删掉AppDelegate或SceneDelegate中启动阶段设置并激活音频会话的代码,不要在应用启动时就抢占音频焦点。仅在播放音频时激活会话
在你准备开始播放电台音频的方法中,再设置并激活音频会话:func startRadioPlayback() { do { // 保持你需要的类别和选项,.duckOthers会让其他音频降低音量而非完全中断 try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.duckOthers, .allowBluetooth]) try AVAudioSession.sharedInstance().setActive(true) // 这里执行音频播放的逻辑(比如启动AVPlayer或AVAudioPlayer) } catch { print("音频会话配置失败: \(error.localizedDescription)") } }停止播放时释放音频会话
当电台停止播放(或暂停超过一定时间)时,停用音频会话,让其他应用可以恢复音频播放:func stopRadioPlayback() { // 先停止音频播放的逻辑(比如暂停/停止AVPlayer) do { // .notifyOthersOnDeactivation会通知其他应用恢复音频 try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation) } catch { print("停用音频会话失败: \(error.localizedDescription)") } }
额外注意:
- 确保你的
Info.plist中已经添加了UIBackgroundModes并包含audio项(这是后台播放的必要配置,你应该已经设置了,但可以确认一下)。 - 如果是短暂暂停电台播放(比如暂停几十秒),可以选择不立即停用会话;但如果是长时间暂停或退出播放界面,建议释放会话以避免占用音频焦点。
内容的提问来源于stack exchange,提问作者Utku Dalmaz
相关产品推荐
相关产品推荐

