2012-08-10 75 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個小時的故障排除的結果。