近日,好多支付語音播報App都遇到一個問題原來好好的語音播報在iOS12.1上無效了,這可急哭了一群小伙伴绸硕,原因是在NotificationService新特性里面爸爸禁用了audio session钢属,下面是官方聲明
為了解決這個問題,樓主也是想了幾種方案:
第一種方案:既然播報不了那是不是可以使用內(nèi)置語音包糖驴,通過推送不同的sound字段來控制播報,答案肯定是可以的佛致,不過這樣有一個弊端會導(dǎo)致IPA包會比較大贮缕,至于語音文件可以使用科大訊飛或是百度語音合成來生成,樓主使用的Python生成的語音包俺榆;
使用腳本生成了10000個語音文件感昼,但是這時候卻發(fā)現(xiàn)10000音頻文件竟然有450M,那這肯定是接受不了的罐脊,所以只能將m4a轉(zhuǎn)成碼率較小的MP3格式定嗓。這時需要用到FFmpeg,所以你需要先搭建環(huán)境萍桌,需要搭建環(huán)境的請戳這里宵溅。接下來進行格式轉(zhuǎn)換了
轉(zhuǎn)換之后發(fā)現(xiàn)語音包大小下降了2/3,ok這就能接受了上炎,當(dāng)然有更好的壓縮方案的小伙伴可以聯(lián)系樓主恃逻,好了,多的也不用講,那我們語音播報一般都有個前綴語音提示寇损,這就需要我們合并一下音頻了凸郑,當(dāng)然沒這個需求的小伙伴可以忽略
最終的文件如下
到這里第一種方案就竣工了,接下來只要后臺根據(jù)支付方式以及支付金額推送不同的sound字段即可
第二種方案:思路也是來源于sound字段矛市,使用語音包還是有一個弊端就是IPA太大线椰,這時萌生了一個想法,能不能動態(tài)拼接呢尘盼?這可把樓主一頓想憨愉,這時發(fā)現(xiàn)一種方案在拓展里面接受到推送后通過發(fā)送本地通知來實現(xiàn)呢?答案是可以的卿捎,多的也不講上代碼
首先將我們準(zhǔn)備好的語音文件主工程配紫,然后設(shè)置對應(yīng)的播放時間(根據(jù)音頻文件來定)
這里需要注意的是我們不需要本地推送有彈窗午阵,所以title和body都設(shè)置為空躺孝,或者注冊通知的時候不啟用UNAuthorizationOptionAlert,還要注意的是拓展里面需要設(shè)置一下本地化底桂。
這樣方案二就算是完成了植袍,但這里有一個弊端就是無法消除震動,只能讓用戶設(shè)置關(guān)閉震動籽懦,優(yōu)勢就是能有效降低IPA包的大小
方案三:使用VOIP喚醒App
VOIP全稱voice-over-ip于个,是iOS8新引入的一種推送方式類型。它可以使用戶收到一個來電時喚醒App暮顺。有了這種新推送厅篓,麻麻再也不用擔(dān)心App長時間在后臺被系統(tǒng)殺死的問題了,因為這種推送消息可以在后臺喚醒App捶码。
具體VOIP的實現(xiàn)這里就不做詳細(xì)的闡述羽氮,VOIP是蘋果針對即時通訊類應(yīng)用開啟的,但并不只有純聊天類應(yīng)用才能通過審核惫恼,微信自然是不用說了档押,肯定是使用的VOIP,支付寶在iOS 12.1來臨之前其實也是使用的語音合成祈纯,后面初期解決12.1播報問題也是使用的語音包令宿,樓主親測如此,就在前天支付寶已經(jīng)完成了iOS12.1語音精準(zhǔn)播報盆繁,然后包的大小并沒有太多變化掀淘,因此樓主基本肯定是使用了VOIP來喚醒App從而達(dá)到語音在線合成播報的目的旬蟋,所以說只要你能提供給爸爸語音/視頻呼入呼出的錄制視頻油昂,基本也是能通過審核大關(guān)的。當(dāng)然VOIP方案雖然是可行,但實現(xiàn)成本過高冕碟,前后端的變動都比較大拦惋,服務(wù)端得搭建一套自己的推送,不再依賴第三方推送平臺安寺。
以上是樓主目前能解決iOS12.1播報問題的三種方案厕妖,綜合體驗和準(zhǔn)確度來說的話,個人還是偏向第一種方案挑庶,各位小伙伴根據(jù)公司自身產(chǎn)品可自行選擇言秸,最后感謝各位的閱讀,如有不足之處或有更好的實現(xiàn)方案請聯(lián)系QQ:895431603