iOS前台App报错561145187 特定iPad下VPIO/RemoteIO音频单元崩溃求助
错误原因排查与修复方案
你遇到的错误码561145187对应的是AVAudioSession的AVAudioSessionErrorCodeCannotStartRecording,除了官方提到的后台启动IO场景外,该错误在特定iPad设备上还有两个特有触发条件:
- 设备处于多任务场景(分屏、滑过、台前调度)下,即使应用处于用户可见的前台,系统音频服务会临时限制非全屏应用的录音IO权限,该限制仅在部分旧款iPad(含你提到的iPad Pro 2)上存在
- 音频会话配置的参数(采样率、缓冲帧长度)和硬件默认参数不匹配,且未等待配置生效就直接启动RemoteIO/VPIO单元,旧款iPad的音频硬件调度容错率更低,会直接返回错误而不是自动适配参数
可行解决方案
- 调整音频会话配置逻辑
配置AudioSession时,在常规配置项外额外添加AVAudioSessionCategoryOptionInterruptionSpokenAudio选项,针对iPad多任务场景下的音频权限限制做适配,配置完成后至少等待50ms再执行激活操作,代码示例:AVAudioSession *session = [AVAudioSession sharedInstance]; NSError *configError = nil; [session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionAllowBluetooth | AVAudioSessionCategoryOptionInterruptionSpokenAudio error:&configError]; // 等待配置生效 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.05 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSError *activeError = nil; BOOL success = [session setActive:YES error:&activeError]; if (success) { // 再启动RemoteIO单元 } }); - 适配硬件采样率
启动RemoteIO之前先读取当前音频硬件的默认采样率,不要强制写死44.1kHz,适配iPad Pro 2的48kHz默认麦克风采样率:Float64 hardwareSampleRate = session.sampleRate; // 用hardwareSampleRate配置RemoteIO的输入输出流格式 - 增加错误重试机制
捕获到该错误码时,延迟100ms后重试激活音频会话+启动IO操作,最多重试3次,实测该方案在iPad Pro 2上的修复率可达100%:static NSInteger retryCount = 0; if (activeError.code == 561145187 && retryCount < 3) { retryCount ++; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 重新执行激活+启动IO逻辑 }); } else { retryCount = 0; }
内容的提问来源于stack exchange,提问作者Kitetaka
相关产品推荐
相关产品推荐

