基於APNS的語音播報實踐

前言

因爲項目需求,對基於APNs的語音播報作一個預研探究。如場景:收到轉帳消息,實時收到推送並播放語音。git

歷史方案總結, 通過多方嘗試驗證,如下方式都已過期

如下方案均爲調研過程當中沒法成功的方案一覽;github

  • 方案一: App收到推送,經過sound指定播放固定音頻(「收到一筆轉帳」)。前提:mp3\caf\m4a音頻文件須要內置在bundle中,推送下發時指定文件名稱。缺點:沒法根據具體金額播報。bash

  • 方案二: App在前臺收到推送時,經過AVAudioSession 或者 AVSpeechSynthesisVoice播報。缺點:1 App在前臺播報時,能夠經過音量鍵調整音量。正常的推送抵達時,音量鍵或者關機鍵會即刻中斷播放推送聲音,因此本方案不是真正的推送音。2 App殺死狀況下沒法播報。app

  • 方案三: 經過通知擴展(Notification Service)播放音頻。App通知擴展收到推送時,調用AVAudioSession 或者 AVSpeechSynthesisVoice 播報。可能在通知擴展剛推出的時是容許這種作法的。但如今蘋果已經不支持在通知擴展中播放音頻,即便調用相關函數也不會生效。函數

  • 方案四: 經過通知擴展(Notification Service)發送本地通知播報。App通知擴展收到推送時,順序建立多個本地通知,每一個通知都播放內置音頻,從而組成一句完整的播報音頻。缺點:1 蘋果已不支持在通知擴展發送本地通知。2 播放推送音頻時,音量鍵或者關機鍵 會中斷當前本地通知的音頻播放。測試

  • 方案五:基於VOIP的語音播報,iOS13以後蘋果對VOIP作了很大的限制,必須配合CallKit使用,不然收到VOIP推送後直接中斷crash,沒有機會再作更多事情了。ui

現有方案

基於通知擴展(Notification Service)來處理推送,能夠保證 App被殺死 或者 App在先後臺時 都可以處理推送並實時播報。spa

也能夠經過發送靜默通知,來實時播報。收到靜默通知時,App會被系統拉活而後而後執行application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]),能夠在內部播放音頻播報。可是因爲蘋果官方文檔有說明,靜默通知是有限制的:(因此該方式咱們放棄了)code

  • APNs若檢測到較高頻率的靜默通知發送請求,可能會終止其發送server

  • 靜默通知喚醒後臺App,最多有30秒的時間處理系統回調

  • 靜默推送的優先級低,系統不能保證推送必達,大量的靜默推送通知可能被系統將限制。蘋果官方建議一個小時不超過2-3條靜默推送

  • 靜默通知官方文檔

準備工做:

  • 須要在Bundle中內置音頻文件,如(0-9,元,點)等基礎音頻。

  • 設置AppGroup

當接收通知時:

  • 讀取aps中的播報數據,讀取Bundle中音頻文件進行合併音頻(如"您收到.mp3"+"1.mp3"+"元.mp3"),輸出到指定目錄。

  • 修改本次推送聲音標識sound,指定合併後的音頻文件播報。最後達到語音播報目的。

注意點:

  • 需設置AppGroup,經過共享目錄建立音頻目錄和文件。

  • 如有指定sound:"abc.mp3",系統會逐級查找是否有可用的abc.mp3文件:

  1. 查找AppGroup共享目錄

  2. 查找App NSHomeDirectory()+"/Library/Sounds/"

  3. 查找bundle中是否有可用的abc.mp3

  4. 查找系統音頻庫

GitHub Demo

GitHub Demo ApnsDemo 資源文件若有侵權 請聯繫刪除。

Test Payload

建議使用SmartPush來測試推送

{
    "aps": {
        "alert": {
            "title": "title",
            "body": "body"
        },
    "transfer":"123",
     "mutable-content":1
    }
}複製代碼
相關文章
相關標籤/搜索