iOS中的背景音频
我正在尝试构建iOS应用程序(iOS> 5.0)。当由用户设置的定时器结束时,它应播放音乐文件。这里是我的设置,如果到目前为止做了什么:iOS中的背景音频
- 我在plist中使用avplayer
- 我设置背景模式为“应用程序播放音频” 在我的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];
这工作得很好。你可以让你的音乐应用程序在后台播放。我的应用程序开始播放音乐应用程序消失的歌曲。我的歌被播放,如果它完成了音乐应用程序继续播放。但只要我的应用程序不在后台。
在后台我得到的错误:
Error Domain=NSOSStatusErrorDomain Code=560161140 "The operation couldn\u2019t be completed. (OSStatus error 560161140.)"
是否有可能的两个组合,在背景(自定义事件)播放和F.E.之间切换music.app和我的应用程序在后台是不可能的?
这里,我的播放器模型的代码:http://pastie.org/4830995
你已经注册您的应用程序在后台继续为音频应用程序运行?为此,请将UIBackgroundModes
密钥添加到您的Info.plist
文件中,并将其值设置为audio
。
我认为你的问题可能与后台处理。您需要在应用程序委托上覆盖此功能。
- (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上。
虽然如果你只是想播放声音,这可能不是最好的方法。也许只是发送本地通知就可以了。
希望这有助于。
Thx为您的答复。这是很好的知道,没有意识到这一点。但是我将测试计时器设置为20秒。问题已经出现在那里。它设置了计时器。关闭应用程序。20秒后出现错误。 – mightym
嗯,你可以制作示例项目并发布链接? – stringCode
这里是我的播放器模型的代码http://pastie.org/4830995 – mightym
是的,正如上面提到的“我的plist中的背景模式设置为”应用程序播放音频“,但我也阅读了几个线程后,背景模式不再有任何影响,因为ios5了。 – mightym
对不起,我不知道。 –