iOS 后臺模式開發指南1——音頻播放

原文鏈接:https://github.com/hehonghuidev/iOS-tech-frontier/blob/master/issue-3/iOS后臺模式開發指南.md


這里簡單紀錄一下如何使用音頻播放實現后臺模式。

**注意: 對于我們這些有點小心思的人來說,如果你的APP確實為用戶播放音頻,你應該只使用后臺音頻模式.如果你嘗試使用這個模式只是為了獲取當程序安靜運行的時候使用CPU的時長,蘋果將拒絕你APP的運行. **

為了獲取到音頻播放裝置,你需要學習 AV Foundation.打開你自定義的類,在頂部加入引用:

import AVFoundation

使用音頻會話的單例模式sharedInstance()去設置播放的類別,也確保了聲音是通過手機揚聲器而不是通過手機聽筒傳播的.如果它執行了,他會檢查調用是否失敗并記錄錯誤.

do{
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, with: .defaultToSpeaker)
} catch {
    print(error)
}

接下來,你要添加播放器這個成員屬性

var player: AVQueuePlayer!

設置歌曲的列表,把它們(這里只有一首,多個歌曲可以參照原文)映射到主程序包的路徑中并把它們轉化為可以在AVQueuePlayer上播放的AVPlayerItems.此外,這個隊列被設置為循環播放.

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()參數的原因.

你也可以根據自己時間精度的需求更改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 的模擬器)音樂將停止.這是為什么呢?還有很重要的一塊落下了!)

對于大多數的后臺模式你需要在Info.plist中添加一個key用來指明APP在后臺中運行的代碼.幸運的是,在Xcode6可以通過復選框進行選擇.

回到Xcode,按照以下步驟進行操作:

1.在項目管理器中點擊工程

2.點擊目標TheBackgrounder

3.點擊功能標簽

4.滑動背景模式并設置為ON

5.選中 Audio和AirPlay

重新編譯并且運行.開始運行音樂并且點擊home鍵,盡管這個APP在后臺運行,這次你就會依舊能夠聽到音樂,也能看到控制臺的輸出.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容