在iOS中实现和排除背景音频

rjs*_*ing 15 iphone avaudioplayer audioqueue avaudiosession ios5

StackOverflow上有很多关于iOS背景音乐播放的问题.没有完全探索所有边缘情况,这个问题的目的是成为iOS背景音频问题的最后一个词

定义和假设

所有代码,问题和示例均参考.

"背景" - 当用户按下主页按钮或电源按钮时应用程序的状态(因此设备显示锁定屏幕).该应用程序还可以使用多任务切换器或iPad上的多任务手势进入后台.

"audio" - 使用AudioQueue播放的音频(包括AVAudioPlayer)

先决条件

据我了解,有一个要求让应用程序在后台播放音频.

  1. 设置UIBackgroundModesaudioInfo.plist
  2. [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

要求

我的用例是在后台播放相对较长的音频(音乐).可能有数百个曲目,应用程序将按顺序播放它们.可以认为音频将无限播放.

该应用程序将通过暂停播放来处理中断.

问题

我的成功喜忧参半:

[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:...];
Run Code Online (Sandbox Code Playgroud)

允许音频在后台播放.但是我很困惑它是否需要以及它与以下内容的区别:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
Run Code Online (Sandbox Code Playgroud)

边缘案例

  1. 中断.如果您注册成为音频中断(电话等)的通知,则成为其代表AVAudioPlayer.例如,如果您在中断开始时暂停或停止音频,则在结束时恢复,如果中断超过10分钟(后台任务完成的最长时间),您的应用程序将被暂停?

  2. 如果调用Lock或Home,模拟器将停止音频,同时使用:

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    
    Run Code Online (Sandbox Code Playgroud)

但是这适用于设备.这是一个已知的问题?

yon*_*nel 5

我有一些GPS背景模式和背景音频的经验.这与你的情况不完全相同(你想播放一个很长的音频文件,我播放短信)但是我可以告诉你:

  • beginBackgroundTaskWithExpirationHandler在后台调用时,此选择器有一个目的:避免应用程序返回到暂停状态,在该状态下不再可以调用代码(您已"冻结").因此,只要您调用beginBackgroundTaskWithExpirationHandler并在终止长时间运行的任务之前beginBackgroundTaskWithExpirationHandler,就使用CPU并消耗电池.
    我真的怀疑在后台播放文件应该使用iPhone的电池,就好像它正在运行一个应用程序,所以我怀疑这beginBackgroundTaskWithExpirationHandler真的涉及到你的流程.

  • 模拟器:不依赖于模拟器:它没有完全实现后台模式.实际上,当您单击主页按钮时,您的应用程序将进入后台,但在此阶段,您仍可以在应用程序中执行代码.一段时间后,您的应用程序将被暂停(=冻结),您的代码执行将被暂停以节省电池.这种暂停状态永远不会出现在模拟器上.

  • 中断.当有电话呼叫时,你不能暂停/恢复播放.平台负责这个,你可以用你的AVAudioSessionDelegate做出反应.但是,您可以通过在音频会话上设置属性来影响会话与其他音频声音交互的方式(例如,请参阅kAudioSessionProperty_OverrideCategoryMixWithOthers).因此流程更多:您描述音频会话应与系统其余部分交互的方式,系统会相应地混合声音,如果会话中断,您将收到AVAudioSessionDelegate的通知.

希望这可以帮助.