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

iOS后台运行时AVAudioRecorder经过一定时长后无通知自动停止问题

AVAudioRecorder 后台90分钟无回调终止问题解决方案

根因定位

苹果官方无公开的后台音频录制时长限制,只要开启了后台音频模式、保持音频会话激活,理论可长期运行。该90分钟无回调终止问题通常由以下三类场景导致:

修复方案

1. 处理音频会话静默失效

后台长时间运行时,系统内存压力、高优先级音频(如系统告警、CarPlay音频切换)抢占后可能静默回收音频会话权限,不会触发常规AVAudioSessionInterruptionNotification通知,仅会将AVAudioRecorder.isRecording置为false。

  • 修复逻辑:
    • 每次启动新的30秒录制任务前,显式调用AVAudioSession.sharedInstance().setActive(true),捕获并处理该方法抛出的所有错误
    • 每次录制结束回调中,额外校验isRecording属性状态,不要完全依赖系统中断通知触发重启逻辑

2. 修复后台任务断言超时

如果使用UIBackgroundTaskIdentifier申请后台执行权限,苹果默认单条后台任务最长执行时间为180秒,若未在每次循环录制时主动销毁旧任务、申请新任务ID,累计超时会触发系统强制回收后台执行权限,无任何回调。

  • 修复代码示例:
// 全局变量存储当前后台任务ID
private var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid

// 每次启动新的录制任务前执行以下逻辑
if backgroundTaskID != .invalid {
    UIApplication.shared.endBackgroundTask(backgroundTaskID)
    backgroundTaskID = .invalid
}
backgroundTaskID = UIApplication.shared.beginBackgroundTask(withName: "AudioRecordingLoop") {
    // 系统即将终止当前后台任务的回调,可在此处主动触发录制重启逻辑
    if self.backgroundTaskID != .invalid {
        UIApplication.shared.endBackgroundTask(self.backgroundTaskID)
        self.backgroundTaskID = .invalid
    }
}

3. 避免AVAudioRecorder实例异常

循环创建录制实例的过程中如果存在循环引用、旧实例未正确释放,累计180次录制(30秒/次 × 180次 = 90分钟)后内存占用触达后台应用内存阈值,系统会直接终止音频相关线程,无应用层回调。

  • 修复逻辑:
    • 每次30秒录制完成后,先调用recorder.stop(),再调用recorder.deleteRecording(),主动将recorder实例置为nil
    • 每次启动新录制任务时重新初始化AVAudioRecorder实例,不要复用旧实例

验证方案

可在应用中添加本地心跳日志逻辑,每10秒写入一次当前录制状态、音频会话激活状态、后台任务ID状态,复现问题后取出日志即可快速定位失效节点。

内容的提问来源于stack exchange,提问作者Edward Pizzurro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:06:05