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