iwa*_*bed 18 iphone cocoa-touch background avaudioplayer ios4
在谈论在后台播放音频时,文档编写得相当糟糕.它给人的印象是,你要继续播放当前正在播放的音频所需要做的就是只为info.plist
文件和wallah 添加一个键/值对,这很神奇.
然而,这种情况并非如此.例如,如果我播放2分钟的mp3,显然音频足够长,以便在我按下主页按钮将我的应用程序发送到后台后播放.问题是,即使我的info.plist
文件中有键/值对,它会暂停音频,然后在我切换回应用程序后继续播放.
Apple指出,音频支持背景和声音的所有框架应该继续播放,直到它结束,然后Apple将暂停你的应用程序.
所以,我的问题是:他们在做什么,我失踪了?我是否还必须以某种方式使用他们的新代表或拨打音频applicationDidEnterBackground
?对我来说,这是没有意义的,因为我没有保存状态(他们通过快速应用程序切换为我做)或者真正处理背景中的任何事情而不是他们认为应该自动处理的音频.
pro*_*rmr 22
您还需要调用beginBackgroundTaskWithExpirationHandler:在开始播放歌曲之前(无论是否在前台都是这样做)和endBackgroundTask结束时.
这告诉iOS即使你的应用程序被放到后台,你也希望能够继续处理.它不会创建新任务或线程,它只是您要继续运行的iOS标志.如果没有这个音频,音频将完成播放,但如果您想要启动另一个音轨,则必须能够在后台运行.
你可以像这样使用它:
// ivar, initialized to UIBackgroundTaskInvalid in awakeFromNib
UIBackgroundTaskIdentifier bgTaskId;
Run Code Online (Sandbox Code Playgroud)
启动音频播放器时,我们保存bg任务ID:
if ([audioPlayer play]) {
bgTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
}
Run Code Online (Sandbox Code Playgroud)
现在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;
}
Run Code Online (Sandbox Code Playgroud)
Jos*_*erg 17
文档中缺少的一部分是您需要设置音频会话.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
Run Code Online (Sandbox Code Playgroud)
添加它,你会很高兴.
归档时间: |
|
查看次数: |
12434 次 |
最近记录: |