我有一个需要在后台继续的AVAudioPlayer。
音频被设置为plist& amp;中的背景模式。这是在发布时运行的:
[[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个小时。会喜欢任何想法。
答案 0 :(得分:4)
如果您正在播放 AVAudioPlayer
,那么您创建 AVPlayer
,播放图标将消失。显然AVPlayer
优先于AVPlayer
。因为它还没有播放,播放图标会从状态栏中消失。
这会导致一些严重的问题:
首先,如果您不必使用AVAudioPlayer
,则不要。我使用它是因为我需要播放远程MP3而不先下载它。我曾经使用过这个AudioStreamer类但放弃了,因为它会在流与其他一些我无法解决的错误断开连接时弹出警报。
因此,如果你坚持使用AVPlayer,只有一种方法可以将你的setCurrentTime
重新连接到播放状态。 如果您在AVAudioPlayer
上致电AVPlayer
,那么它会神奇地将自己重新关联为该应用的当前播放器。因此,您需要在初始化AVAudioPlayer
之后以及在setCurrentTime
上恢复播放时随时拨打电话。
我决定将AVAudioPlayer子类化,以便我可以在全局列表中注册它(当它被初始化时)并在解除分配时取消注册它。我也覆盖了play方法,这样任何恢复播放的调用也会调用setCurrentTime。然后我将AVPlayer子类化,以便任何时候初始化,所有活动的AVAudioPlayers都会调用setCurrentTime。最后一件事 - 你需要在短暂的,可能是1秒的延迟后拨打{{1}},否则它将无效。
不开玩笑,这是近40小时故障排除的结果。