当谈论在后台播放音频时,文档写得相当糟糕。它给人的印象是,要继续播放当前正在播放的音频,您只需将键/值对添加到info.plist
文件和wallah,这很神奇。
然而,这种情况并非如此。例如,如果我播放 2 分钟长的 mp3,显然音频足够长,可以在我按下主页按钮将应用程序发送到后台后播放。问题是,即使我的键/值对info.plist
文件时,它会暂停音频,然后在我切换回应用程序后恢复播放。
Apple 声明所有音频框架都支持背景,并且声音应继续播放直至结束,然后 Apple 将暂停您的应用程序。
所以,我的问题是:他们在做什么而我错过了?我是否还必须以某种方式使用他们的新代表或在applicationDidEnterBackground
?对我来说,这没有意义,因为我没有保存状态(它们通过快速应用程序切换为我做)或真正处理后台中的任何内容,除了他们所说的应该自动处理的音频。
您还需要在开始播放歌曲之前调用 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)