iOS 4 Background Audio

iOS 4 Background Audio

最近半個月一直在忙公司iPhone App修改和上架的事。改改bug調調UI那是每天的例行小事。最頭疼的是將現在的基於iOS 3的app升級成基於iOS 4的版本。對,沒錯,我們希望我們的app能夠在iPhone 4上全面支持multitasking,而對於一個音樂類app來說,也就是我們的app能夠在後臺播放,並且能夠全面接管iPod app的控制鈕和圖標。就像Spotify和Pandora一樣。

然而這真的是一件很讓人頭疼的事情。蘋果的iOS 4官方文檔在background有點語焉不詳。按照官方文檔(http://bit.ly/cIZBEO)的說法:

  • 首先,你得使用最新版的Xcode
  • 接着,打開使用舊版Xcode創建的工程文件,修改***info.plist文件,其實也就是告訴Xcode,“我這app呀,它打算支持後臺音樂播放”

官方文檔到這就差不多沒了。按照這樣的修改方法,我們試了試,還真行。唉呆會,不對,怎麼放完了一首歌就自動停住了?

恩哪。還真會停住。具體情況是:

  • 如果音頻操作是用蘋果官方的AVFoundation.framework實現的話,每播放完一首歌曲,app就會自動被iOS給suspend掉。這有一個山寨的解決辦法:另init一個AVAudioPlayer的實例,從app啓動開始,就不斷重複播放一個無聲的音頻片段。這個方法能夠保證歌曲切換的間隙裏app仍然有音頻輸出。而只要不斷有音頻輸出,iOS就不會把你的app給suspend掉。真的很山寨,但如果你使用的就是AVFoundation這個framework的話,這招對付舊版Xcode的代碼真的很管用。
  • 如果你使用的是著名的開源的AudioStreamer的舊版代碼。恩,這個這個,上述偷偷放歌的方法就不是很管用了。app啓動以後就會自己crash掉。可是,萬幸的是,AudioStreamer最近剛剛推出了更新版,已經可以很好的支持iOS 4的後臺播放功能了,看這裏:http://github.com/DigitalDJ/AudioStreamer

恩到這裏,後臺不間斷播放的問題就解決了。無論是播放本地音樂庫(AVAudioPlayer or AudioStreamer),還是播放在線內容(AudioStreamer),我們都可以輕鬆的按下Home鍵然後邊玩別的邊聽音樂了。然而這還不是問題的全部,我們的app還沒有順利接管iOS 4快速切換菜單(Switching board)中的iPod導航鈕。這個,下篇博文再說。


iOS 4 Background Audio 續

接上篇,同時勘一下上篇的誤。

恩,先勘誤:

  • Audiostreamer的更新版放棄了對iOS 3的支持。如果你將Audiostreamer搬進iOS 3的工程的話,會直接crash。沿着crash report找到崩潰的原因,恩, handlePropertyChangeForQueue 函數比之前的iOS 3版本多出了些iOS 4纔有的東西。iOS 3到這裏會掛掉。
  • 恩,不過我們可以修改一下這裏的代碼。執行 handlePropertyChangeForQueue 函數之前先做個判斷。如果是老的iOS,我們就還是按老的代碼來辦。行,沒問題,程序到這OK。不過還是有問題。Audiostreamer的網絡鏈接部分老是報錯,無法從服務器端拿到數據。原因不明。
  • 接管iPod控制鈕和實現後臺播放,其實是一件事。這個,下面詳細講。

然後說說接管iPod控制鈕的事。我們的最終花花腸子在此:

其實說簡單很簡單。可是蘋果的文檔啊,看的人頭疼。

  • 首先,進 ***-info.plist 文件裏,建立一個新的key,名叫 UIBackgroundModes ,在右側 Value 欄,新增一個值, audio .
  • 然後找到工程裏那個負責音頻播放的類。
  • 依次重載這個類的 viewDidAppear 、 viewWillDisappear 、 canBecomeFirstResponder 、 remoteControlReceivedWithEvent 函數。這裏貼一下 viewDidAppear 的代碼:

假設你的網絡鏈接模塊正常的話,此刻,你的app應該已經完全接管iPod的控制鈕了。 :-P


發佈了61 篇原創文章 · 獲贊 9 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章