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

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)

  • @IWasRobbed:如果你想在后台切换音轨(这不是原始问题)你需要这个,否则当音频播放结束时你的应用程序会暂停.见[本讨论](https://devforums.apple.com/message/239381). (4认同)
  • 你是否真的需要完成任务完成的所有麻烦来启动背景音频?这与WWDC 2010视频中关于该主题(第109节 - 在iPhone OS上采用多任务处理,第2部分)的材料相反,它们显示他们的avTouch应用程序正在转换为背景音频,他们的关键是当你在后台时防止进一步使用GPU,因为这会杀死应用程序.这是通过注册UIApplicationDidEnterBackgroundNotification并在后台阻止GPU使用来完成的. (2认同)

Jos*_*erg 17

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

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
Run Code Online (Sandbox Code Playgroud)

添加它,你会很高兴.