iOS 12.1 語(yǔ)音播報(bào)問(wèn)題

前言

因?yàn)槟壳八诘墓臼亲鼍酆现Ц兜募辏嫦虻挠脩羰巧碳也秩允湛畈?bào)金額這一塊用戶很是看重护盈,在iOS12.1之前一直用的都是UNNotificationServiceExtension推送擴(kuò)展灵莲,然后使用本地錄好的MP3音頻文件根據(jù)推送過(guò)來(lái)的金額合成m4a格式文件放在本地然后使用AVAudioPlayer進(jìn)行播放路克,一直以來(lái)都挺好,限制就是iOS10之前不支持琼开,然后對(duì)iOS10之前的錄了一個(gè)固定格式的音頻文件進(jìn)行推送播放易结,但是最新iOS12.1系統(tǒng)UNNotificationServiceExtension突然間不行的,系統(tǒng)的合成稠通,百度合成衬衬,科大訊飛合成买猖,通通不行改橘,系統(tǒng)的AVAudioPlayer也是廢,經(jīng)測(cè)試百度的離線合成根本不能在UNNotificationServiceExtension用玉控,因?yàn)橥扑蛿U(kuò)展系統(tǒng)分配的內(nèi)存資源很少飞主,只能做一些微小的操作,調(diào)起百度的離線合成直接就內(nèi)存溢出直接掛掉了高诺,但是在線合成也只支持iOS12.1之前的系統(tǒng)碌识。我目前經(jīng)過(guò)了接近兩周的研究和網(wǎng)上查找目前找到了兩種方式,但是這兩種都有很大可能被拒虱而,所以在這里分享出來(lái)大家討論一下筏餐,或者都多提交試試,互相分享一下過(guò)審經(jīng)驗(yàn)牡拇。

目前播報(bào)的兩種方式

1魁瞪、UNNotificationServiceExtension

還是使用UNNotificationServiceExtension推送擴(kuò)展,但是播放器的不能在使用AVAudioPlayer了惠呼,而是要使用AudioServicesPlaySystemSound导俘,這個(gè)是C語(yǔ)音的一個(gè)用來(lái)播放提示音或者手機(jī)振動(dòng)的一個(gè)功能,限制是只能播放30秒剔蹋,而且需要在UNNotificationServiceExtension的infoplist里面添加App plays audio or streams audio/video using AirPlay目前網(wǎng)上查到的沒(méi)有一個(gè)使用這種方式通過(guò)審核的旅薄,使用AudioServicesPlaySystemSound進(jìn)行播放只能播放本地的音頻文件,建議使用本地錄好的MP3音頻文件根據(jù)推送過(guò)來(lái)的金額合成m4a格式文件放在本地然后進(jìn)行播放泣崩,這樣比較省事少梁,也可以選擇使用科大訊飛的SDK文字轉(zhuǎn)語(yǔ)音獲取mp3文件放在本地然后進(jìn)行播放洛口。音頻文件也是可以盜用其他app的,比如支付寶的凯沪,收錢吧的绍弟,可以在PP助手里面下載到他們的ipa包,直接把后綴改成zip格式的進(jìn)行解壓著洼,然后就可以獲取他們的資源包樟遣,然后右鍵顯示報(bào)內(nèi)容然后進(jìn)行mp3格式進(jìn)行搜索就能查到了,我目前用的是收錢吧錄制的mp3文件身笤,感覺(jué)挺自然的豹悬,我們自己產(chǎn)品錄得就是一坨屎。

下面粘貼一下AudioServicesPlaySystemSound方式的播放代碼


SystemSoundID soundID;

AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);

AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, &playCallback, (__bridge void * _Nullable)(self));

AudioServicesPlaySystemSound(soundID);


void playCallback(SystemSoundID ssID, void* __nullable clientData) {

    AudioServicesDisposeSystemSoundID(ssID);

    selfClass.contentHandler(selfClass.bestAttemptContent);

    NSLog(@"播放完成...");

}

url代表音頻文件的路徑液荸,playCallback是播放完成的回調(diào)方法瞻佛,是C語(yǔ)言的方法,想要在C語(yǔ)言里面調(diào)用OC的方法需要在外面聲明一下

static NotificationService *selfClass =nil;然后在合適的時(shí)機(jī)selfClass = self;就可以了娇钱。

2伤柄、VOIP

最近一直在網(wǎng)上查到播報(bào)的問(wèn)題,看到VOIP突然有了靈感于是就寫了一個(gè)Demo文搂,經(jīng)測(cè)試可以實(shí)現(xiàn)語(yǔ)音播報(bào)适刀,而且即使在殺死程序的情況下也是可以播報(bào)的,我是看了這篇帖子寫的demo,寫的很不錯(cuò)煤蹭,而且里面還提供了PHP的后臺(tái)代碼笔喉,改一改token自己就可以本地測(cè)試了。

但是目前還是有所限制硝皂,因?yàn)閂OIP是專門為網(wǎng)絡(luò)電話類型的app提供的一種喚醒a(bǔ)pp的模式常挚,但是我們的app的做聚合支付的呀跟網(wǎng)絡(luò)電話沒(méi)一點(diǎn)關(guān)系,而且如果走VOIP模式的話稽物,之前的推送基本就是要推倒了奄毡,后臺(tái)就要對(duì)應(yīng)用戶去管理token了,不能再向之前去依賴極光贝或,信鴿啥的第三方了吼过,所以比較費(fèi)時(shí)費(fèi)力,就怕你費(fèi)時(shí)費(fèi)力的搞好了然后被拒了就惡心了傀缩。

這我在網(wǎng)上找的一個(gè)關(guān)于怎么審核的可行方案那先,但是呼入可以錄制,但是哪來(lái)的呼出呢

1赡艰、當(dāng)app要上傳App Store時(shí)售淡,請(qǐng)?jiān)趇Tunes connect上傳頁(yè)面右下角備注中填寫你用到VoIP推送的原因,附加上音視頻呼叫用到VoIP推送功能的demo演示鏈接,演示demo必須提供呼出和呼入功能揖闸。

我已經(jīng)把寫的demo放在GitHub的鏈接VOIPDEMO揍堕,里面也有多個(gè)mp3合成一個(gè)m4a的方法。
demo里面你們只需要看VoicePlayingManager這個(gè)類和AppDelegate這個(gè)類就可以了汤纸,其他都不需要看衩茸,只是之前寫testdemo亂寫的。

VOIP證書制作要看這篇帖子贮泞。

今天測(cè)試了一下微信的收款是可以的楞慈,即使殺死程序也會(huì)播報(bào),所以目前可以肯定微信一定是通過(guò)VOIP的方式實(shí)現(xiàn)的啃擦,因?yàn)槲⑿疟緛?lái)就是VOIP類型的程序所以過(guò)審分分鐘囊蓝,但是支付寶就沒(méi)有語(yǔ)音聊天的功能所以不能用VOIP,還有收錢吧是內(nèi)置了一千多個(gè)音頻文件令蛉,通過(guò)推送sound字段然后后臺(tái)去控制的一種很物理的方式聚霜,而且覆蓋不到全部金額,比如你去測(cè)試付個(gè)0.12元就不會(huì)播報(bào)金額了珠叔,但是測(cè)試0.01元就可以蝎宇。

我建了一個(gè)iOS12.1語(yǔ)音播報(bào)交流群 839097185 沒(méi)事都可以過(guò)來(lái)討論討論。

又想到一個(gè)方式祷安,就是通過(guò)后臺(tái)推送喚醒去播報(bào)金額姥芥,但是不能退出殺死程序而且需要勾選后臺(tái)播放模式,可能會(huì)被拒辆憔,但是可以申訴就是不知道能不能給過(guò)撇眯。小伙伴們可以嘗試去提交一下报嵌,通過(guò)的過(guò)來(lái)交流一下過(guò)審經(jīng)驗(yàn)虱咧。
這是之前寫的推送后臺(tái)喚醒打印藍(lán)牙小票的帖子可以參考一下 地址
最新消息 2018年12月11日 下午4點(diǎn)26分更新內(nèi)容:支付寶實(shí)現(xiàn)了12.1之后的語(yǔ)音播報(bào)使用的是VOIP的方式有圖為證

實(shí)際去使用支付寶,發(fā)現(xiàn)他們并沒(méi)有實(shí)現(xiàn)語(yǔ)音通話的功能锚国,就是不知道他們?cè)趺催^(guò)審的腕巡,肯定是申訴,大家們行動(dòng)起來(lái)都去搞VOIP申訴過(guò)審呀血筑,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊绘沉,上面有VOIP的實(shí)現(xiàn)方式。

3豺总、本地推送

本地推送就是车伞,把播報(bào)金額拆分成,一喻喳、二另玖、三,四、五...千谦去、百慷丽、萬(wàn)、點(diǎn)鳄哭、元等一個(gè)個(gè)音頻文件要糊,根據(jù)推送過(guò)來(lái)的金額進(jìn)行進(jìn)行篩選然后按照順序放入數(shù)組,然后循環(huán)數(shù)組進(jìn)行創(chuàng)建并發(fā)送本地推送妆丘。
我使用的是遞歸的方式根據(jù)音頻的時(shí)間循環(huán)發(fā)送本地推送的锄俄。類似于下圖。


1550039680319.jpg

這個(gè)方法的好處很直觀勺拣,包比上面那種方法小珊膜,缺點(diǎn)就是聲音很難聽,很奇怪宣脉,想讓它聲音變得好聽车柠,要花費(fèi)不少時(shí)間了,在錄音和播放時(shí)間上想想辦法塑猖。還有就是本地通知每傳一次會(huì)震動(dòng)一次竹祷,比如:收銀到賬,震一下羊苟,九塑陵,震一下,萬(wàn)蜡励,震一下令花,八,震一下凉倚,千兼都,震一下,七稽寒,震一下扮碧,百,震一下杏糙,六慎王,震一下,十宏侍,震一下赖淤,五,震一下谅河,點(diǎn)咱旱,震一下嗜愈,四,震一下莽龟,三蠕嫁,震一下,元毯盈,震一下剃毒。這個(gè)暫時(shí)沒(méi)有什么好方法,只能引導(dǎo)用戶關(guān)掉設(shè)置里的震動(dòng)開關(guān)搂赋。另外赘阀,本地通知的語(yǔ)音播報(bào)容易被打斷。
??用這個(gè)方法脑奠,還會(huì)有個(gè)問(wèn)題基公,比如888.88元,分位上的八可能會(huì)因?yàn)榻俏簧系陌说耐ㄖ獙?duì)音頻的引用沒(méi)結(jié)束,分位上的八就要播, 會(huì)出現(xiàn)播不了的情況宋欺。解決方法思路:數(shù)字的mp3文件多復(fù)制一份轰豆,命名如:*_copy.mp3, 循環(huán)判斷string數(shù)組,如果與前一個(gè)string重復(fù)齿诞,就改成 *_copy酸休,這樣,就不會(huì)連續(xù)讀取一個(gè)文件了祷杈。

注意:音頻文件add的時(shí)候要兩個(gè)targets都要勾選斑司。還有本地推送的方式,APP在前臺(tái)的時(shí)候是沒(méi)有聲音的但汞,前臺(tái)需要走正常的推送解析宿刮,走正常的語(yǔ)音播報(bào),反正都在前臺(tái)了私蕾,不就想怎么播怎么播了僵缺。
還有,不需要考慮推送序列的問(wèn)題是目,擴(kuò)展里面是要self.contentHandler(self.bestAttemptContent);走完這句代碼推送到達(dá)真正的App里面時(shí)候谤饭,才會(huì)處理下一個(gè)推送。

總結(jié)

第一個(gè)方法是廢棄了懊纳,打包會(huì)成功但是上傳包審核的時(shí)候我直接報(bào)錯(cuò)。
第二個(gè)方法亡容,可行但是改動(dòng)巨大嗤疯,而且不一定能申訴過(guò)審。
第三個(gè)方法闺兢,目前是可行性最大的茂缚,也是我目前使用的戏罢,無(wú)過(guò)審壓力。
第四種方法脚囊,錄制1w+的音頻然后修改推送sound龟糕。

self.contentHandler(self.bestAttemptContent);這句話的意思是,擴(kuò)展里面的東西處理完了悔耘,這個(gè)推送可以到達(dá)真正的APP里面去了的一個(gè)結(jié)束語(yǔ)讲岁。

也可以三四方法結(jié)合使用,畢竟第三種方法有很多弊端衬以。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缓艳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子看峻,更是在濱河造成了極大的恐慌阶淘,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件互妓,死亡現(xiàn)場(chǎng)離奇詭異溪窒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)冯勉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門霉猛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人珠闰,你說(shuō)我怎么就攤上這事惜浅。” “怎么了伏嗜?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵坛悉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我承绸,道長(zhǎng)裸影,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任军熏,我火速辦了婚禮轩猩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荡澎。我一直安慰自己均践,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布摩幔。 她就那樣靜靜地躺著彤委,像睡著了一般。 火紅的嫁衣襯著肌膚如雪或衡。 梳的紋絲不亂的頭發(fā)上焦影,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天车遂,我揣著相機(jī)與錄音,去河邊找鬼斯辰。 笑死舶担,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的彬呻。 我是一名探鬼主播衣陶,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼废岂!你這毒婦竟也來(lái)了祖搓?” 一聲冷哼從身側(cè)響起餐弱,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤泉懦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后桨武,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體财骨,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镐作,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隆箩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片该贾。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捌臊,靈堂內(nèi)的尸體忽然破棺而出杨蛋,到底是詐尸還是另有隱情,我是刑警寧澤理澎,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布逞力,位于F島的核電站,受9級(jí)特大地震影響糠爬,放射性物質(zhì)發(fā)生泄漏寇荧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一执隧、第九天 我趴在偏房一處隱蔽的房頂上張望揩抡。 院中可真熱鬧,春花似錦镀琉、人聲如沸峦嗤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)寻仗。三九已至,卻和暖如春凡壤,著一層夾襖步出監(jiān)牢的瞬間署尤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工亚侠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留曹体,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓硝烂,卻偏偏與公主長(zhǎng)得像箕别,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子滞谢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容