在StackOverflow上有很多关于iOS背景音乐播放的问题。没有一个能够完全探索所有边角案例,这个问题的目的是成为iOS背景音频问题的最终答案。
定义和假设
所有代码、问题和示例均指向ios5。
"后台" — 当用户按下主页键或电源键(使设备显示锁屏)时,应用程序进入的状态。也可以使用多任务切换器或iPad上的多任务手势将应用程序置于后台。
"音频" — 使用AudioQueue(包括AVAudioPlayer)播放的音频。
前提条件
据我所知,要使应用程序在后台播放音频,需要满足以下两个要求:
- 在
Info.plist
中设置UIBackgroundModes
为audio
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
需求
我的用例是在后台播放相对较长的音频(如音乐)。有可能有数百个轨道,应用程序将按顺序播放它们。可以认为音频将无限期地播放。
应用程序将通过暂停播放来处理中断。
问题
我在尝试使用以下方法时遇到了一些问题:
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:...];
允许音频在后台播放。但我不确定是否需要以及它与以下内容有何不同:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
边缘情况
中断。如果你注册了成为
AVAudioPlayer
的代理来接收音频中断通知(如电话等),例如当中断开始时暂停或停止音频,当中断结束后恢复播放,那么如果中断超过10分钟(后台任务完成的最大时间),你的应用程序会被挂起吗?在使用中,模拟器如果锁定或者按下 Home 键,会停止音频播放:
但是这在设备上可以工作。这是否是已知的问题?[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];