Iphone 在iOS4上输入背景以播放音频

Iphone 在iOS4上输入背景以播放音频,iphone,cocoa-touch,background,avaudioplayer,ios4,Iphone,Cocoa Touch,Background,Avaudioplayer,Ios4,当谈到在后台播放音频时,文档编写得相当糟糕。它给人的印象是,要继续播放当前正在播放的音频,只需在info.plist文件中添加一个键/值对,然后wallah,这很神奇 然而,情况并非如此。例如,如果我播放一个2分钟长的mp3,很明显,当我按下home(主页)按钮将我的应用程序发送到后台后,音频足够长,可以播放。问题是,即使我的info.plist文件中有这个键/值对,但一旦我切换回应用程序,它会暂停音频,然后恢复播放 苹果公司声明,所有支持后台音频和声音的框架应继续播放,直到结束,然后苹果公司将

当谈到在后台播放音频时,文档编写得相当糟糕。它给人的印象是,要继续播放当前正在播放的音频,只需在
info.plist
文件中添加一个键/值对,然后wallah,这很神奇

然而,情况并非如此。例如,如果我播放一个2分钟长的mp3,很明显,当我按下home(主页)按钮将我的应用程序发送到后台后,音频足够长,可以播放。问题是,即使我的
info.plist
文件中有这个键/值对,但一旦我切换回应用程序,它会暂停音频,然后恢复播放

苹果公司声明,所有支持后台音频和声音的框架应继续播放,直到结束,然后苹果公司将暂停你的应用程序


那么,我的问题是:他们在做什么,我错过了什么?我是否也必须以某种方式使用他们的新代理,或者调用
应用程序识别背景上的音频?对我来说,这是没有意义的,因为我没有保存状态(他们使用快速应用程序切换来为我保存状态),也没有真正在后台处理除音频以外的任何其他内容,他们说音频应该自动处理。

文档中缺少的一部分是您需要设置音频会话

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

加上这些,你就可以开始了。

你还需要在开始一首歌曲之前(无论是否在前台)调用beginBackgroundTaskWithExpirationHandler:并在歌曲结束时调用endBackgroundTask

这告诉iOS,即使你的应用程序被放在后台,你也希望能够继续处理。它不会创建新的任务或线程,它只是一个你想要继续运行的iOS标志。音频将在没有此功能的情况下播放到结束,但如果您想开始另一首曲目,则必须能够在后台运行

您可以这样使用它:

// ivar, initialized to UIBackgroundTaskInvalid in awakeFromNib
UIBackgroundTaskIdentifier bgTaskId; 
启动音频播放器时,我们保存bg任务id:

if ([audioPlayer play]) {
  bgTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
}
现在audioPlayerDidFinishPlaying:回调仍然会发生,因为我们已经告诉iOS,我们正在执行的任务需要继续,即使我们被放到后台。这样我们就可以得到回调并启动下一个音频文件

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)success
{
    UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;

    if (self.haveMoreAudioToPlay) {
        newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
        [self playNextAudioFile];
    }

    if (bgTaskId != UIBackgroundTaskInvalid) {
        [[UIApplication sharedApplication] endBackgroundTask: bgTaskId];
    }

    bgTaskId = newTaskId;
}      

为什么你要开始一个背景任务只是为了播放音频。这一点都不必要。你认为这会让它只在你请求
beginBackgroundTaskWithExpirationHandler
时在苹果分配的时间内保持活动状态吗?还是只要你使用
AudiodFinishPlaying
循环播放一个声音或播放一个新的声音,它就会一直播放?你真的需要经历这项任务的所有麻烦吗完成启动后台音频?这与WWDC 2010视频中关于该主题的内容相反(“第109课时-在iPhone操作系统上采用多任务处理,第2部分”),在第24分钟左右,他们展示了他们的avTouch应用程序正在转换为背景音频,他们的关键是当你在后台时防止进一步使用GPU,因为这将扼杀该应用程序。这是通过注册UIApplicationIdentinterBackgroundNotification并防止在后台使用GPU来完成的。@IWasRobbed:如果您想在后台切换音频曲目(这不是最初的问题),则需要此选项,否则当音频播放完后,应用程序将挂起。瞧。@Andrei我已经有好几年没有做背景音频了,所以我现在说不出什么是有效的。2010年以来发生了很多变化。至少有人意识到了这一点!:)乔希,你得到了复选标记,别担心:)它就像一个符咒。stackoverflow在我缓慢的网络上搞砸了,所以我不得不关闭浏览器来纠正它(只是到处玩:)如果你觉得不清楚文档错误是否依赖于音频会话,你应该提交一份雷达文件。很好,我一定会这样做,这样我们就可以避免其他人的头痛。再次感谢你,我从丹·奎尔那里学过拼写:)