iOS应用使用AVFoundation播放音频时休眠/后台停止,如何实现持续播放?
iOS后台/锁屏状态下持续音频播放解决方案
你需要依次完成以下配置和代码调整即可实现需求:
1. 开启项目后台音频权限
这是系统允许App后台播放音频的前提,没有配置的话代码逻辑正确也会被系统终止后台活动:
- 打开Xcode项目,进入对应Target的「Signing & Capabilities」标签页
- 点击
+ Capability按钮添加「Background Modes」能力 - 必须勾选「Audio, AirPlay, and Picture in Picture」选项
2. 优化AVAudioSession配置逻辑
你当前代码已经设置了AVAudioSession.Category.playback类别,这个类别本身就支持后台、锁屏播放,只需要调整配置时机即可:
- 不要等到首次触发播放时才配置音频会话,建议将配置逻辑放在App启动完成的
application(_:didFinishLaunchingWithOptions:)方法中提前执行,避免后台场景下配置失败 - 参考优化后的配置代码:
/// 全局初始化音频会话,建议放在App启动逻辑中调用 func setupAudioSession() { let soundSession = AVAudioSession.sharedInstance() do { // 不需要和其他App音频混音的话options留空即可,有混音需求可以加.mixWithOthers try soundSession.setCategory(.playback, mode: .default, options: []) try soundSession.setActive(true) } catch { print("音频会话配置失败: \(error.localizedDescription)") } }
3. 监听音频中断事件,异常中断后自动恢复播放
当出现来电、闹钟响、其他App抢占音频会话等情况时,你的音频会被暂时中断,需要监听系统通知,在中断结束后手动恢复播放:
// 在播放器初始化完成的位置添加通知监听 NotificationCenter.default.addObserver( self, selector: #selector(handleAudioInterruption(_:)), name: AVAudioSession.interruptionNotification, object: nil ) /// 音频中断处理方法 @objc private func handleAudioInterruption(_ notification: Notification) { guard let userInfo = notification.userInfo, let typeRaw = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt, let interruptionType = AVAudioSession.InterruptionType(rawValue: typeRaw) else { return } switch interruptionType { case .ended: // 中断结束,系统允许恢复播放时重启音频 if let optionRaw = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt, AVAudioSession.InterruptionOptions(rawValue: optionRaw).contains(.shouldResume) { audioPlayer?.play() } case .began: // 中断开始,可自行记录当前播放进度等信息 break @unknown default: break } }
4. 其他异常排查点
如果完成以上操作后仍有问题,检查以下项:
- 确认代码中没有其他逻辑会调用
AVAudioSession.sharedInstance().setActive(false)或者修改音频会话的category,会导致后台播放失效 - 如果你播放的是远程网络音频,
AVAudioPlayer对网络流的适配性较差,建议替换为AVPlayer实现,避免后台加载失败导致播放停止 - 确认测试时没有开启系统低电量模式,低电量模式会限制部分App的后台活动,可能导致音频播放被终止
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

