我的应用程序使用AVAudioPlayer播放背景音频,并从iOS接收远程控制事件.音频播放时一切正常,但如果音频暂停并且我的应用程序移动到后台,则会发生奇怪的事情.如果我使用蓝牙设备在10分钟后恢复/取消暂停音频,iOS将使用以下消息终止我的应用:
<MyApp>[633] has active assertions beyond permitted time:
{(
<SBProcessAssertion: 0x25f520> identifier: com.apple.mediaremote.sendremotecommand process: <MyApp>[633] permittedBackgroundDuration: 600.000000 reason: finishTask owner pid:58
)}
Run Code Online (Sandbox Code Playgroud)
这有两件非常奇怪的事情.
iOS不会在10分钟后关闭我的应用程序.只有在通过蓝牙接收远程控制命令后才会这样做.
如果我在耳机上使用iOS的遥控器按钮或遥控器,我的应用程序将继续播放音频而不会有任何问题.
我无法弄清楚为什么蓝牙遥控器消息会导致iOS终止我的应用程序.我已经能够确认Pandora应用程序似乎没有类似的问题.
有没有人对此有所了解?
更新:进一步测试揭示了对错误的更清晰的描述.在音频暂停10分钟或更长时间并且应用程序遇到内存不足警告后,尝试恢复背景音频时,似乎会发生应用程序强制iOS崩溃.
以下步骤是重现错误所必需的:
注意:当从外部设备(如蓝牙设备,扬声器底座或汽车适配器)启动最终远程控制事件时,iOS似乎只会强制崩溃应用程序.使用iOS的内置"遥控"界面或耳机上的遥控器似乎不会导致崩溃.
就像George在评论中提到的那样,我已经能够用我自己的App,Pandora和至少一个其他音频播放应用程序重现这一点.我已经向Apple提交了一份错误报告.
我有一个音频应用程序,它使用媒体播放音频会话类别来允许背景音频.初始化音频会话后,iOS设备上的硬件音量按钮将控制音频会话的音量.
一旦音频播放停止,我想将手机振铃器的控制权返回到硬件音量按钮,但我尝试通过停用音频会话来做到这一点并不成功.
以下是我初始化和激活音频会话的方法:
AudioSessionInitialize(NULL, NULL, interruptionListenerCallback, self);
AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,
audioRouteChangeListenerCallback,
self);
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
sizeof(sessionCategory),
&sessionCategory);
Run Code Online (Sandbox Code Playgroud)
以下是我尝试停用音频会话并将iOS设备的振铃控制权返回到硬件音量控件的方法:
AudioSessionSetActive(false);
Run Code Online (Sandbox Code Playgroud)
我知道至少有一个应用程序就是这样(Audible.com的iOS应用程序).有谁知道我可能做错了什么?
ios ×2
audiosession ×1
avplayer ×1
bluetooth ×1
hardware ×1
ios4 ×1
iphone ×1
multitasking ×1
volume ×1