支付宝有一个功能,就是,别人扫描你的二维码给你转账之后,收到钱会有一条语音推送,“支付宝到账 1000万” 之类的推送消息,不管你的支付宝app有没有被杀死。
有两种方案实现了上面描述的场景:
必备条件
上面的描述场景只有在 iOS 10 以上版本才可以,因为必须要基于 Notification Service Extension
实现方式
1、Service Extension 中收到推送之后,用AVSpeechSynthesisVoice相关类,直接把推送过来需要播报相关的文字转化成语音播报
2、ServiceExtension中收到推送之后,将要播报的数字,找到对应的单个音频,排序,用拼接音频的方式<通过推送过来的文字去查找相关的音频,然后拼接成一个音频>,然后使用AudioServicesCreateSystemSoundID播放
在介绍相关方式之前,先介绍一个测试工具
SmartPush
使用方式也很简单,应该一看就懂
#import "NotificationService.h"
import <AVFoundation/AVFoundation.h>
@interface NotificationService ()
@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;
@end
@implementation NotificationService // https://www.cnblogs.com/lidongq/p/5968923.html TTS文字转语音
- (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);
[self playVoiceWithAVSpeechSynthesisVoiceWithContent:self.bestAttemptContent.body];
}
// 添加的
- (void)playVoiceWithAVSpeechSynthesisVoiceWithContent:(NSString *)content {
if (content.length == 0) {
return;
}
// 创建嗓音,指定嗓音不存在则返回nil
AVSpeechSynthesisVoice *voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"];
// 创建语音合成器
AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init];
// 实例化发声的对象
AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:content];
utterance.voice = voice;
utterance.rate = 0.5; // 语速
// 朗读的内容
[synthesizer speakUtterance:utterance];
}
- (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);
}
@end
推送的内容是:
{
"aps":{
"alert":{
"title":"iOS 10 title",
"subtitle":"iOS 10 subtitle",
"body":"世上只有妈妈好,有妈的孩子像块宝。投进妈妈的怀抱,幸福哪里找。没妈的孩子像根草"
},
"my-attachment":"http://img01.taopic.com/160317/240440-16031FU23937.jpg",
"mutable-content":1,
"category":"myNotificationCategory1",
"badge":3
}
}
// 以下是个人保存
{
"aps": {
"alert": {
"title": "title",
"subtitle": "subtitle",
"body": "body"
},
"badge": 1,
"sound": "default",
"category": "test_category",
"mutable-content": 1
},
"key1":"value1",
"key2":"value2"
}
坑点
说明:当前实现的是将push内容中的body播放出来
1、如果你收到推送了但是添加了系统的铃声,也就是你在push的json中添加了"sound":"default"那么就可能会影响推送声音的播放
2、收到推送了,但是没有播报语音,检查一下这里
3、播放的声音时间长度,经过测试最多是5秒钟,这里应该是苹果做了限制,拿上面的推送内容举例子"body":"世上只有妈妈好,有妈的孩子像块宝。投进妈妈的怀抱,幸福哪里找。没妈的孩子像根草",最多也就是播放到世上只有妈妈好,有妈的孩子像块宝。投进妈妈的怀抱