基於APNS的語音播報實踐

前言


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

歷史方案總結, 經過多方嘗試驗證,以下方式都已過時

以下方案均爲調研過程中無法成功的方案一覽;

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

  • 方案二: App在前臺收到推送時,通過AVAudioSession 或者 AVSpeechSynthesisVoice播報。缺點:1 App在前臺播報時,可以通過音量鍵調整音量。正常的推送抵達時,音量鍵或者關機鍵會即刻中斷播放推送聲音,所以本方案不是真正的推送音。2 App殺死情況下無法播報。

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

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

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

現有方案


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

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

  • APNs若檢測到較高頻率的靜默通知發送請求,可能會終止其發送
  • 靜默通知喚醒後臺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
    }
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章