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