在iOS4上input背景音乐

谈论在后台播放audio时,文档写得相当糟糕。 它给人的印象是,所有你必须做的继续播放你正在播放的audio只是添加一个键/值对info.plist文件和wallah,这是魔术。

然而,这种情况并非如此。 例如,如果我播放2分钟长的mp3,显然audio足够长,可以在我点击主页button将我的应用程序发送到背景后播放。 问题是,即使我在我的info.plist文件中有这个键/值对,它会暂停audio,然后在切换回应用程序时继续播放。

苹果声明,所有的audio支持背景和声音的框架应该继续播放,直到它结束,然后苹果将暂停你的应用程序。

所以,我的问题是:他们在做什么,我失踪了? 我是否也必须以某种方式使用他们的新委托或在applicationDidEnterBackground上调用audio? 对我来说,这是没有意义的,因为我没有保存状态(他们为我做快速的应用程序切换),或真正处理任何事情在背景中,而不是他们认为应该自动处理的audio。

文档中缺less的一部分是您需要设置您的audio会话。

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

补充一点,你会很好去。

您还需要拨打电话beginBackgroundTaskWithExpirationHandler:开始歌曲之前(无论是否在前台),endBackgroundTask结束时。

这告诉iOS,即使您的应用程序被置于后台,您也希望能够继续处理。 它不会创build一个新的任务或线程,它只是一个标志,你想继续运行的iOS。 audio将在没有这个的情况下播放完成,但是如果您想要开始另一个音轨,则完成后,您必须能够在后台运行。

你可以像这样使用它:

 // ivar, initialized to UIBackgroundTaskInvalid in awakeFromNib UIBackgroundTaskIdentifier bgTaskId; 

启动audio播放器时,我们保存bg任务ID:

 if ([audioPlayer play]) { bgTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]; } 

现在audioPlayerDidFinishPlaying:callback仍然会发生,因为我们已经告诉iOS我们正在做一个需要继续的任务,即使我们把它放在后台。 这样我们得到的callback,并可以开始下一个audio文件。

 - (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; }