You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 02:24:03