iOS 4開始引入的multitask,我們可以實現像ipod程序那樣在後台播放音頻了。如果音頻操作是用蘋果官方的AVFoundation.framework實現,像用AvAudioPlayer,AvPlayer播放的話,要實現完美的後台音頻播放,依據app的功能需要,可能需要實現幾個關鍵的功能。
首先,播放音頻之前先要設置AVAudioSession模式,通常只用來播放的App可以設為AVAudioSessionCategoryPlayback即可。模式意義及其他模式請參考文檔。
1。通知OS該app支持background audio。缺省情況下,當按下home鍵時,當前正在運行的程序被suspend,狀態從active變成in-active,也就是說如果正在播放音頻,按下HOME後就會停止。這裡需要讓app在按在HOME後,轉到後台運行而非被suspend,解決辦法是在程序的-info.plist中增加required background modes這個key項,並選擇App plays audio這個value項。
2。現在按下HOME鍵後,程序退到後台,但是聲音仍在播放。但是如果要實現播放列表的依次播放、循環播放,即放完一首後自動切換到下一首,問題來了,當App在後台放完一首後,就會停下來。原因是在後台運行時,一旦聲音停下來,程序也隨之suspend,因此在切換文件加載的間隙,程序就會被suspend。曾經有山寨的解決辦法是專門起一個player的實例連續不停的放同一無聲音片斷,阻止程序被suspend。這裡提供的方法是通過申請後台taskID達到後台切換播放文件的功能。
即聲明後台task id,並通過beginBackgroundTaskWithExpirationHandler將App設為後台Task,達到持續後台運行的目的。我們知道一般情況下,按HOME將程序送到後台,可以有5或10秒時間可以進行一些收尾工作,具體時間[[UIApplication sharedApplication] backgroundTimeRemaining]返回值。超時後app會被suspend,現在要做的就是用[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]開始後台任務,可以將後台運行超時時間長時間的延長,具體延長多少時間還是見返回值,總之對於放段時間音樂應該夠了。另一個問題是每個開始的後台任務,都必須用endBackgroundTask來結束。 因此,在每次開始播放後啟動新的後台任務,同時結束上一個後台任務:首先,要在viewdidload中
當然,還有更方便的辦法就是在resignActive時beginBackgroundTaskWithExpirationHandler:並在BecomeActive中endBackgroundTask: