原文鏈接:https://github.com/hehonghuidev/iOS-tech-frontier/blob/master/issue-3/iOS后臺(tái)模式開發(fā)指南.md
這里簡單紀(jì)錄一下如何使用音頻播放實(shí)現(xiàn)后臺(tái)模式。
**注意: 對于我們這些有點(diǎn)小心思的人來說,如果你的APP確實(shí)為用戶播放音頻,你應(yīng)該只使用后臺(tái)音頻模式.如果你嘗試使用這個(gè)模式只是為了獲取當(dāng)程序安靜運(yùn)行的時(shí)候使用CPU的時(shí)長,蘋果將拒絕你APP的運(yùn)行. **
為了獲取到音頻播放裝置,你需要學(xué)習(xí) AV Foundation.打開你自定義的類,在頂部加入引用:
import AVFoundation
使用音頻會(huì)話的單例模式sharedInstance()去設(shè)置播放的類別,也確保了聲音是通過手機(jī)揚(yáng)聲器而不是通過手機(jī)聽筒傳播的.如果它執(zhí)行了,他會(huì)檢查調(diào)用是否失敗并記錄錯(cuò)誤.
do{
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, with: .defaultToSpeaker)
} catch {
print(error)
}
接下來,你要添加播放器這個(gè)成員屬性
var player: AVQueuePlayer!
設(shè)置歌曲的列表,把它們(這里只有一首,多個(gè)歌曲可以參照原文)映射到主程序包的路徑中并把它們轉(zhuǎn)化為可以在AVQueuePlayer上播放的AVPlayerItems.此外,這個(gè)隊(duì)列被設(shè)置為循環(huán)播放.
let url = Bundle.main.url(forResource: "你的歌曲文件名字", withExtension: "你的歌曲文件格式")
let song = AVPlayerItem(url: url!)
player = AVQueuePlayer(items: [song])
player.actionAtItemEnd = .advance
使用addPeriodicTimeObserverForInterval(_:queue:usingBlock:),給播放器一個(gè)周期性的觀察者,如果這個(gè)APP在前臺(tái),這個(gè)觀察者每一秒就會(huì)被調(diào)用一次并且更新UI.由于你想在結(jié)束時(shí)更新UI,你必須確保這些代碼在主隊(duì)列中被調(diào)用.這就是你指定dispatch_get_main_queue()參數(shù)的原因.
你也可以根據(jù)自己時(shí)間精度的需求更改CMTimeMake的值,比如CMTimeMake(1, 100)就是1秒調(diào)用100次.對應(yīng)的format可以改成 "%02.2f".
player.addPeriodicTimeObserver(forInterval: CMTimeMake(1, 1), queue: DispatchQueue.main) { (time) in
let timeString = String(format: "%1.f", CMTimeGetSeconds(time))
print(timeString)
}
當(dāng)你調(diào)用播放器的播放方法,就能從控制臺(tái)看到輸出信息了。
player.play()
測試后臺(tái)模式是否起作用.按home按鈕(如果你正在使用模擬器,按Cmd-Shift-H).如果你在真正的設(shè)備上運(yùn)行(不是Xcode 的模擬器)音樂將停止.這是為什么呢?還有很重要的一塊落下了!)
對于大多數(shù)的后臺(tái)模式你需要在Info.plist中添加一個(gè)key用來指明APP在后臺(tái)中運(yùn)行的代碼.幸運(yùn)的是,在Xcode6可以通過復(fù)選框進(jìn)行選擇.
回到Xcode,按照以下步驟進(jìn)行操作:
1.在項(xiàng)目管理器中點(diǎn)擊工程
2.點(diǎn)擊目標(biāo)TheBackgrounder
3.點(diǎn)擊功能標(biāo)簽
4.滑動(dòng)背景模式并設(shè)置為ON
5.選中 Audio和AirPlay

重新編譯并且運(yùn)行.開始運(yùn)行音樂并且點(diǎn)擊home鍵,盡管這個(gè)APP在后臺(tái)運(yùn)行,這次你就會(huì)依舊能夠聽到音樂,也能看到控制臺(tái)的輸出.