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