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的控制鈕了。