iOS10 实现支付宝收款播报

今天给大家介绍一下如何在iOS10下实现程序后台状态下,将接收到推送消息进行语音播报(demo见文章最后)

前言

前段时间在做XX银行O2O的商户端的时候其中有一个功能商户二维码收款。行方提的需求是希望跟支付宝收款的功能一样,在收款之后能够进行语音播报,说实话一开始还是比较懵逼的不知道该怎么实现。通过各种百度和探索发现i0S10下的UNNotificationServiceExtension+ AVSpeechSynthesizer实现这一功能。

之前项目也比较的忙没有来得及整理,最近时间稍微宽裕了点,就来跟大家分享一下是如何实现的顺便记录一下。

为项目集成推送

集成推送相对来说挺简单的,目前市面上的三方也挺多的,各种集成文档也挺多的。这里我就简单介绍一下如何集成推送。

1.配置推送证书

这个我这里就不说了网上挺多的也挺简单的
如果还是有同学不是很清楚 点这里

2.到三方平台创建应用并上传推送证书

此处需要注意推送的证书的bundleid要一致

3.为工程配置推送
开启推送.png
4.设置后台
设置后台.png
5.编写推送的代码(这里以个推为例)

代码挺多的我就不一一粘贴了如果你实在是不想写下载个demo一顿复制粘贴就行了
个推
极光

6.测试客户端能否顺利接收到推送消息

到三方推送的后台直接手动推送看能否接收到推送消息

拦截推送消息进行语音播报

新建一个UNNotificationServiceExtension

1、新建Target
屏幕快照 2017-10-13 下午3.22.13.png

新建Target.png

然后下一步为新建的Target取个名字点击完成

这里需要注意的是这里的bundleID是你的工程名字的bundleID加上.新Target名称。

到这里新建Extension就完成了下面就开始写代码吧

2、实现播报代码

打开我们新建的Extension我们发现有三个文件

NotificationService.h
NotificationService.m
Info.plist

打开NotificationService.m我们会看到系统默认的代码

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];
    
    // Modify the notification content here...
    self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title];
    
    self.contentHandler(self.bestAttemptContent);
}

- (void)serviceExtensionTimeWillExpire {
    // Called just before the extension will be terminated by the system.
    // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
    self.contentHandler(self.bestAttemptContent);
}

接下来我们就是要往delegate注入我们播报的代码了

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    // copy发来的通知,开始做一些处理
    self.bestAttemptContent = [request.content mutableCopy];
    
    // Modify the notification content here...
//    self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title];
    NSLog(@"userInfo----->%@",self.bestAttemptContent.userInfo[@"payload"]);
    NSData *jsonData = [self.bestAttemptContent.userInfo[@"payload"] dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *pushdic = [NSJSONSerialization JSONObjectWithData:jsonData
                                                        options:NSJSONReadingMutableContainers
                                                          error:nil];
    //这里我定义的Type 1--表示需要播报的推送 2--无需播报
    //Content是需要播报的内容
    if ([pushdic[@"Type"] isEqualToString:@"1"]) {
         //开始语音播报
        [self startSpeaking:pushdic[@"Content"]];
    }
    self.contentHandler(self.bestAttemptContent);
}
- (void)startSpeaking:(NSString *)words{
    AVSpeechSynthesizer * synthsizer = [[AVSpeechSynthesizer alloc] init];
    synthsizer.delegate = self;
    AVSpeechUtterance * utterance = [[AVSpeechUtterance alloc] initWithString:words];//需要转换的文本
    utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"];//国家语言
    utterance.rate = 0.6f;//声速
    utterance.volume = 1;
    [synthsizer speakUtterance:utterance];
}

到这里我们的基本功能就实现了,再到三方后台推送试一下。如果没有播报再回过头检查一下是不是哪一步出现了问题

细心的同学可能会发现有时候播报的声音大有时候播报的音量小。这里我们还需要优化一下,也就是我们自己来控制播报的音量。我找了一下。发现确实可以设置音量,但是私有API官方不允许使用即使用了也会被拒。
我找了一下,发现一个类MPMusicPlayerController。这个类有一个值,volume可以直接设置。接下来我们修改一下代码

- (void)startSpeaking:(NSString *)words{
    AVSpeechSynthesizer * synthsizer = [[AVSpeechSynthesizer alloc] init];
    synthsizer.delegate = self;
    AVSpeechUtterance * utterance = [[AVSpeechUtterance alloc] initWithString:words];//需要转换的文本
    utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"];//国家语言
    utterance.rate = 0.4f;//声速
    utterance.volume = 1;
    //修改播放时的音量 根据自己的需要来定
    MPMusicPlayerController* musicController = [MPMusicPlayerController applicationMusicPlayer];
    musicController.volume = 0.7;
    [synthsizer speakUtterance:utterance];
}

到此本次分享就完成了,如果有哪位小伙伴还不是很明白可以留言或者私信我。如果小伙伴觉得这里还有什么不妥留下你的建议我们共同探讨 ~~
最后留下Demo有需要的可以去下载

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容