前言
由於項目需求,對基於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文件:
- 查找AppGroup共享目錄
- 查找App NSHomeDirectory()+"/Library/Sounds/"
- 查找bundle中是否有可用的abc.mp3
- 查找系統音頻庫
GitHub Demo
GitHub Demo ApnsDemo
資源文件如有侵權 請聯繫刪除。
Test Payload
建議使用SmartPush來測試推送
{
"aps": {
"alert": {
"title": "title",
"body": "body"
},
"transfer":"123",
"mutable-content":1
}
}