公司要求像支付宝收款一样,收到推送后实现语音播报功能,之前没有做过,特此机会研究一下。
用到的技术点:
1.如果对语音要求不是特别高的情况下,用苹果系统自带的AVSpeechUtterance可以实现,也可以用讯飞的sdk。
2.之前公司用的是友盟推送,可以实现基本的弹框形式推送,为了语音播报在锁屏情况正常,我增加了iOS10 推出的UNNotificationServiceExtension “推送扩展”
关于在前台实现语音播报,很简单,
xcode 后台设置
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler(前台收到通知的代理方法)中写语音播报的方法
AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:alterText];
// utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-TW"];//设置语言
// utterance.rate = 0.4; //设置语速
// utterance.volume = 0.0; //设置音量(0.0~1.0)默认为1.0
// utterance.pitchMultiplier = 1.0; //设置语调 (0.5-2.0)
// AVSpeechSynthesizer *synth = [[AVSpeechSynthesizer alloc] init];
// [synth speakUtterance:utterance];
在后台实现语音播报
谢谢www.jianshu.com/p/c06133d576e4作者的分享,利用作者提供的方法,我也实现了在后台播放,但是锁屏或关闭app是无法完成语音播报的。我根据作者提供的UNNotificationServiceExtension,搜索使用方法完成了锁屏情况的语音播报。
1.UNNotificationServiceExtension的创建参考www.cocoachina.com/ios/20161017/17769.html创建完成后- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler中语音播报的方法添加进去,这个方法主要是在没有推出弹框前,给30s的时间处理推送的内容,所以要推送的语音最好不要太长。
注意:如果项目需求是在前台和后台播放,就仅需要参考www.jianshu.com/p/c06133d576e4的方法,如果所有情况都需要,仅需要添加UNNotificationServiceExtension,填写语音播报的代码,⚠️,一定要推送的 "aps"字典中,一定要包含 mutable-content 键,并且 mutable-content 的值为 1。不然不走推送扩展的方法。
支付宝就是利用此方法完成iOS10以后的语音播报,iOS10以前只需要播报一端固定的语音,把固定音频文件放在目录下,后台的sound 参数写上音频文件的名字。
我已经完成了语音播报功能,遇到什么问题,可以直接私信,我会回答的。