淺談iOS語(yǔ)音播報(bào)功能實(shí)現(xiàn)

最近有個(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),其步驟如下:


步驟1

步驟2

然后在彈出的界面中,輸入“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)容:

info.plist文件配置

接下就是我要重點(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ò)之后總算有曙光了啊~~


受啟發(fā)文字

我也是靈機(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 fetchRemote 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ì)列模式,而且播放完成之后刪除該文件!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容