記錄一下前段時間的產(chǎn)品提出的坑爹需求。前段時間要求實現(xiàn)商家收款訂單的語音播報功能, 并且要求實現(xiàn)的功能是點擊APP進入后臺或者APP進程殺死之后,依舊能收到語音播報,于是只能考慮蘋果的推送擴展(Notification Service Extension), 在網(wǎng)上查找了一番教程之后,發(fā)現(xiàn)蘋果在iOS12.1后就禁用了里面的AVAudioPlayerimage.png
于是開始了漫漫填坑之路,由于要求app后臺也能播報,那么就只能使用推送進行。好在蘋果雖然禁用了語音推送,但推送時的sounds我們還可以自定義(沒錯,就是我們平常微信聽到的那聲叮咚!)這個sounds有個最大播放時長,大概是在10s左右,所以語音文字不能太長,語速也盡量控制的快一點,我們是直接上萬能的淘寶找人專門錄了一套語音文件,包括xxx收款,個十百千萬,1234567890等等這些。然后再根據(jù)收到的錢進行語音拼接合成。
之后又遇到個新的問題,推送擴展和主項目工程其實相當于兩個獨立的target,我們將語音文件放在主工程目錄下,Notification Service Extension是無法直接訪問聲音文件的。---這個時候就需要用到APP Group了。下面是APP Group的介紹
- AppGroup allows data sharing between two different apps or even app and widgets by creating one common shared path (like document directory). Data saved over there can be accessed by any app which is associated with that particular AppGroup. It is an offline data sharing between apps.
這段蘋果說明告訴我們:App Groups可以使兩個不同的Target(或者APP與其Extension)之間進行數(shù)據(jù)共享。
AppGroup的創(chuàng)建也非常簡單:
1.在Apple Developer中配置APP的App ID時,勾選AppGroups選項:

image.png
2.創(chuàng)建AppGroup

image.png
3.將APP Groups添加到APP ID中?;氐讲襟E1創(chuàng)建的APP ID那里,可以看到APP Groups選項為黃色待編輯狀態(tài),點擊Edit將步驟2創(chuàng)建的APP Groups添加進去

image.png
4.將APP Groups添加到Xcode工程中

image.png

image.png
這樣處理好了之后就可以在NotificationServiceExtension里面愉快的訪問聲音文件了。之后我們只需要在NotificationServiceExtension解析推送數(shù)據(jù),合成語音,播放即可。下面上代碼,文中會有注釋

image.png

image.png
PS:關(guān)于代碼中的拼接播報語音,之前我們是想本地合成語音來著,但是由于收到推送后再臨時去合成語音+播放,這個時間太短(推送的那聲sounds也就10s~)怕來不及,就采用了先后臺合成語音片段再推送過來的方式。并且安卓那邊也采用后臺合成的語音片段,便于兩端統(tǒng)一。
