AUIOClient_StartIO failed (-12985) when app under background

  这一段时间做的这个项目一直很忙,所以都没有时间总结。最近终于稍有空闲,并且解决了几个所谓的大问题,特意记录一下,避免以后忘记。

  由于公司的音频播放引擎是用audio unit 写的,这项技术非常底层,需要处理很多东西,因此比较容易出问题。前段时间测试经常反馈后台有时候不能播放,并且找不到规律,也就是不能重现的bug,这种bug最叫人头疼,想解决的时候不能重现,你放弃了它就蹦出来烦你。后来在我的不懈努力下,终于找到了重现的方法。当app在后台模式下被中断后,在 endInterruptionWithFlags:(NSUInteger)flags 中再次激活audio session的话会收到失败消息,如果不去激活audio session 的话,直接打开audio unit的话会收到AUIOClient_StartIO failed (-12985)这个错误,导致audio unit无法打开,但是回到前台则可以打开audio unit以播放音频,实在使令人诧异。看了各种的官法文档,搜索了各种资料也没有找到相关的信息。就在要放弃的时候尝试了打开这个属性kAudioSessionProperty_OverrideCategoryMixWithOthers,哈哈这时候便可以在后台被中断后打开audio unit,实现音频的继续播放。但是这个解决方案并不完美,打开这个属性以后会导致remote events实效,这时就在右上角看不到三角形的播放按钮了,所以这是一个不完美的解决方案。

  后来过了一段时间,还是反馈问题,觉得有必要再看看,技术人员都相信没有解决不了的问题,尤其是别家的貌似都没有这个bug。后来无意中再demo中打开了接收remote events,居然可以正常的打开audio unit了。原来是这样,也可以正常的激活audio session了,这样子线控也可以工作,不会有因为使用kAudioSessionProperty_OverrideCategoryMixWithOthers导致的线控失效的问题。

  为什么打开接收remote events就可以激活audio unit,并没有找到可靠的资料证明。如果大家有知道的话,烦请解惑,先谢过了。我猜测的原因是,可能是打开接收remote events后为了保证线控等在app处于后台模式时也可以工作,默默的注册了某些服务,使在后台模式也可以激活audio unit。如果没有打开接受remote events,则app在后台模式被中断后,因为没有注册某些相应的服务,所以audio unit启动失败。

  所以你只需要调用[[UIApplicationsharedApplication] beginReceivingRemoteControlEvents],就可以解决AUIOClient_StartIO failed (-12985)这个错误。

原文地址:https://www.cnblogs.com/CoderPlace/p/3234589.html