iOS中的背景音频

时间:2012-09-27 10:26:00

标签: ios audio background avplayer

我正在尝试构建iOS应用程序(iOS> 5.0)。当用户设置的计时器结束时,它应该播放音乐文件。这是我的设置,如果到目前为止做了什么:

  • 我使用avplayer
  • 我在我的plist中将背景模式设置为“App plays Audio”
  • 在我的appDelegate中我有:

    NSError *sessionError = nil;
    [[AVAudioSession sharedInstance] setDelegate:self];
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError];
    
  • 在一首歌将要播放之前:

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError];
    [[AVAudioSession sharedInstance] setActive:YES error:&sessionError];
    
  • 我通过“playerItemDidPlayToEnd”通知我的应用程序,停止播放器并告诉其他应用程序,例如music.app再次激活

    _avPlayer = nil;
    NSError *sessionError = nil;
    [[AVAudioSession sharedInstance] setActive:NO withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:&sessionError];
    

这很好用。您可以在后台播放音乐应用。我的应用程序开始播放音乐应用消失的歌曲。播放我的歌曲,如果完成,音乐应用程序继续播放。但只要我的应用程序不在后台。

在后台我收到错误:

  

错误域= NSOSStatusErrorDomain代码= 560161140“操作无法完成。(OSStatus错误560161140。)”

是否有可能同时在后台播放(在自定义事件上)和在f.e之间切换。 music.app和我在后台的应用程序是不可能的?

这是我的播放器型号的代码:http://pastie.org/4830995

2 个答案:

答案 0 :(得分:0)

我认为您的问题可能与后台处理有关。您需要在app delegate上覆盖此功能。

  - (void)applicationDidEnterBackground:(UIApplication *)application
{
 __block UIBackgroundTaskIdentifier task = 0;
 task=[application beginBackgroundTaskWithExpirationHandler:^{
     NSLog(@"Expiration handler called %f",[application backgroundTimeRemaining]);
    [application endBackgroundTask:task];
    task=UIBackgroundTaskInvalid;
}];

}
除非发出声音,否则你的应用程序将在6分钟后被杀死。如果您的用户设置超过6分钟的计时器,您可以做的是每5.5分钟播放一次非常响亮的声音以保持应用程序活着并开始新的后台任务。此外,你必须考虑很多事情不会在后台执行。我做了一些类似于你正在做的事情。我所做的是创建NSObject的自定义子类,处理音乐播放和应用程序到期的东西。因为很多功能和通知都不会在后台运行VC,所以它在我的代表中成为了一个强大的属性。

虽然如果你只是想播放声音,这可能不是最好的方法。也许只是发送本地通知就可以了。

希望这会有所帮助。

答案 1 :(得分:-1)

您是否注册了自己的应用以继续作为音频应用在后台运行?为此,请将UIBackgroundModes密钥添加到Info.plist文件,并将其值设置为audio