如何实现推送并播报消息?

字数 593阅读 38495

项目需要一个类似美团的那种播音功能

首先我们先来实现播音功能

我们就用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

刚开始好了 但是一会又不行了 目前不知道什么原因 ,就执行代码但是没声音

********那么问题来了,到底如何才能再接受到通知的时候,不管是后台运行还是黑屏状态都能读推送的消息呢?

推荐阅读更多精彩内容