2012-08-10 104 views
0

我有一个需要在后台继续的AVAudioPlayer。AVAudioPlayer失去“播放”状态

音频设置为在plist中&背景模式这个运行在启动:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
[[RootController shared].view becomeFirstResponder]; 

AVAudioSession* session = [AVAudioSession sharedInstance]; 
[session setDelegate: self]; 
[session setActive:YES error:nil]; 
[session setCategory: AVAudioSessionCategoryPlayback error:nil]; 

- (BOOL)canBecomeFirstResponder { return YES; } 

的问题

偶尔AVAudioPlayer获得在这个陌生的状态,其中:

  • 这是玩,但状态栏中的播放图标消失
  • 如果我暂停然后播放,图标显示了可能一秒钟,然后消失
  • 这里的踢球 - 如果我叫setCurrentTime同时播放,播放图标显示&住宿

我已经沉没约20小时到这个&会爱任何想法。

回答

4

描述的Bug

的如果你是玩一个然后AVAudioPlayer创建一个AVPlayer,播放图标会消失。显然AVPlayer立即优先&,因为它尚未播放,播放图标从状态栏中消失。

这会导致一些严重的问题:

  1. 如果应用程序在后台,,iOS将在5秒内关闭AVAudioPlayer(因为它不知道你玩音频)
  2. 的iOS的远程显示,即使音频播放
  3. 播放图标是不是在状态栏上显示

的解决方法

播放按钮

首先,如果您不必使用AVPlayer,则不要。我使用它,因为我需要播放远程MP3,而无需先下载它。我曾经使用这个AudioStreamer类,但放弃了,因为它在流被断开时会弹出一个警告,以及一些我无法修复的其他错误。

因此,如果您遇到AVPlayer,只有一种方法可以重新连接您的AVAudioPlayer的播放状态。 如果您在AVAudioPlayer上致电setCurrentTime,那么它会神奇地将自己重新关联为应用的当前玩家。所以你需要在任何AVPlayer被初始化之后调用它,并且只要你在AVAudioPlayer上恢复播放。

我决定继承AVAudioPlayer的子类,以便我可以在全局列表中注册它(当它被初始化时)并在它被释放时取消注册。我也重写播放方法,以便任何调用恢复播放也将调用setCurrentTime。然后,我对AVPlayer进行了分类,以便在初始化任何时候,所有活动的AVAudioPlayers都会自行调用setCurrentTime。最后一件事 - 在短暂的,也许是1秒的延迟之后,你必须拨打setCurrentTime,否则它将不起作用。

没有开玩笑,这是近40个小时的故障排除的结果。