最近有個(gè)小需求,即iOS消息推送語(yǔ)音播報(bào),類似我們聽到的支付寶和微信播報(bào)錢數(shù)。幾年前自己做過(guò),但那時(shí)候做出來(lái)的現(xiàn)在想想怎么能用太水形容呢?出現(xiàn)不播報(bào)的情況十有八九,最近拉出來(lái)再搞搞震,真是非常幸運(yùn)~
在這里,將我遇到的問(wèn)題以及解決方案給羅列出來(lái)供大家參考,如有錯(cuò)誤之處,請(qǐng)大家斧正!
首先,我們用到的是蘋果的推送擴(kuò)展(Notification Service Extension),其步驟如下:


然后在彈出的界面中,輸入“Product Name”之后“下一步”之后有個(gè)激活的提示,我們點(diǎn)擊Activate按鈕即可,然后在toolbar上的“Scheme”中可以選擇它進(jìn)行調(diào)試等工作。
以上工作完成之后,你會(huì)發(fā)現(xiàn)當(dāng)前項(xiàng)目工程里面多了一個(gè)文件夾,此文件夾即為剛創(chuàng)建的推送擴(kuò)展。文件夾中的有2個(gè)文件:“NotificationService”和“info.plist”文件。

注:在info.plist中最好配置如下內(nèi)容:

接下就是我要重點(diǎn)介紹說(shuō)明的內(nèi)容:
度娘上的解決方案一:用系統(tǒng)自帶的類“AVSpeechSynthesisVoice”播放,但本人試了之后無(wú)效,執(zhí)行到第一行代碼就閃退(同樣的代碼中主工程中執(zhí)行完全正常),所以該方案行不通;
-
度娘上的解決方案二:用系統(tǒng)自帶的類“AVAudioPlayer”去播放音頻文件,但蘋果在iOS12.1的文檔中已明確說(shuō)明禁用AVAudioPlayer”(包括AVSpeechSynthesisVoice),所以該方案也是行不通;
蘋果教程說(shuō)明 參考一文章【https://blog.csdn.net/qq_30513483/article/details/107686195】之后,我靠?。?!那是豁然開朗啊~
原文內(nèi)容如下:
self.bestAttemptContent.sound = [UNNotificationSound soundNamed:@"shoukuanAuido.wav"];
self.contentHandler(self.bestAttemptContent);
很明顯這里根本沒(méi)有說(shuō)清楚到底怎么拖”shoukuanAuido.wav“?我也試著拖了,但結(jié)果就是無(wú)情的淚水咯,淚崩~~
但淚是沒(méi)用的,問(wèn)題終歸要解決?。?!
下面這段話相當(dāng)爽啊,感覺(jué)心頭一萬(wàn)個(gè)CNM踩過(guò)之后總算有曙光了啊~~

我也是靈機(jī)一動(dòng),先添加wav文件到Bundle中,然后再?gòu)?fù)制文件到Library的”Sounds“目錄下面播放,喜大普奔,NM,成功了?。?!以下是我在swift文件“NotificationService”中的代碼段:
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
self.bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
//是否為空?
if let bestAttemptContent = self.bestAttemptContent {
// Modify the notification content here...
bestAttemptContent.title = "\(bestAttemptContent.title)"
//播報(bào)內(nèi)容
let sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: "voice_noti_new_order.wav"))
bestAttemptContent.sound = sound
contentHandler(bestAttemptContent)
}
}
注意:
在項(xiàng)目target-Capabilities-Background Modes中要記得勾選Background fetch和Remote notifications這樣設(shè)置才可以正常接收推送。并且在設(shè)置推送的時(shí)候,一定要帶上這個(gè)字段:“mutable-content”,只有將該字段設(shè)置為1,才可以正常實(shí)現(xiàn)功能。
后記:
有些文章用AppGroup做文章,其實(shí)這種也是完全可以的,這種方式很靈活,可以在本地生成文件,也可以從服務(wù)器上生成wav文件手機(jī)端下載(請(qǐng)注意生成wav文件的播報(bào)時(shí)長(zhǎng),據(jù)說(shuō)是6秒)。
最后,不管是本地生成文件還是下載文件,皆要保存在目錄:”Sounds“下,并且播放過(guò)程可以用采用隊(duì)列模式,而且播放完成之后刪除該文件!
