項目需要一個類似美團的那種播音功能
首先我們先來實現播音功能
我們就用iOS自帶的SIRI功能來讀首先 先導入
import <AVFoundation/AVFoundation.h>
//初始化語音播報
AVSpeechSynthesizer * av = [[AVSpeechSynthesizer alloc]init];
//設置播報的內容
AVSpeechUtterance * utterance = [[AVSpeechUtterance alloc]initWithString:@"輕輕的我走了,正如我輕輕的來"];
設置語言類別 我這里用的臺灣口音, 因為我發現大陸的口音SIRI不會讀,好像剛學會說話的小孩子一樣 說的不清楚 具體原因我也不知道
AVSpeechSynthesisVoice * voiceType = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-TW"];
utterance.voice = voiceType;
//設置播報語速
utterance.rate = 0.4;
[av speakUtterance:utterance];
好的測試一下 確實可以讀了 , 下面開始寫推送自動讀取消息,這里我用的是極光推送,就以iOS10的接受推送的方法為例
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler
{
NSDictionary *aps =userInfo[@"aps"];
解析出來需要讀得文字
NSString *alert = aps[@"alert"];
讓SIRI來讀消息
[self siriWithcontent:alert];
}
好了,現在讀出了推送的消息,然而問題來了, 如果是運行時沒有問題,但是當鎖屏,或后臺運行時發現不點擊推送消息,就不執行SIRI讀文字的方法,想想有沒有直接執行的辦法呢?這個時候找到一個Background Modes 的方法,具體實現如下:
首先要打開Remote notifications,并加入content-available: 1 這個參數
976B517A-19EE-4BBC-A0C1-B0BAEEAA7605.png
打開以后推送的時候就會走以下的方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
打斷點以后發現執行了,但是SIRI沒有聲音了,剛開始我還以為我的方法除問題了,后來一想不對 啊, 剛開始讀得好好的,就從新看了一下后臺運行的這個方法,發現Background Modes的Remote notifications是一個靜默推送方法:就是收到推送(沒有文字沒有聲音),不用點開通知,不用打開APP,就能執行
這個是用戶完全感受不到推送消息的到來和程序的某塊代碼已經執行了,切不發出任何的聲音,只是用戶正在鎖屏,它會亮一下屏幕,沒有任何聲音,也沒有任何消息框和痕跡,用于更新程序的某些數據又不想讓用戶知道的情況下用的
然后我又加了Background fetch如圖
9AB2DCB7-3ABE-44EC-ACCA-9B06E47E8FB1.png