2

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

  • 我用avplayer
  • 我已将 plist 中的背景模式设置为“应用程序播放音频”
  • 在我的 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。)”

是否有可能在后台播放(在自定义事件上)以及在 fe music.app 和我的后台应用程序之间切换这两种组合是不可能的?

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

4

2 回答 2

0

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

  - (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 上。

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

希望这有帮助。

于 2012-09-27T11:20:34.343 回答
-1

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

于 2012-09-27T11:06:48.567 回答