设为首页 加入收藏

TOP

iOS10 语音播报填坑详解(解决串行播报中断问题)(四)
2019-08-31 01:03:38 】 浏览:154
Tags:iOS10 语音 播报 详解 解决 串行 中断 问题
语音播报完成的函数,我们将 呼出通知栏的代码 self.contentHandler(self.bestAttemptContent); 添加到这个代理函数中。意思就是:当第一条语音播放完成了,这时我们呼出通知栏显示播放的内容(通知栏的周期时间大概6秒左右),正好这时可以播放第二条语音,等第二条语音播放完成了,呼出第二个通知的通知栏,继续播放第三天语音,以此类推。

看到这里,想必大家应该都理解了为啥之前总是语音播报中断的问题。

还有一个很重要的函数:- (void)serviceExtensionTimeWillExpire{},我们上面只是提了下,具体他具体有什么功能尼?

我们发现serviceExtensionTimeWillExpire函数中,也调用了 self.contentHandler(self.bestAttemptContent) 这行代码,它为啥也要调用这行代码尼?

这是因为:当我们在接受通知的钩子函数中(didReceiveNotificationRequest)没有调用self.contentHandler(self.bestAttemptContent) 这行代码,这时就会出现一个现象:就是通知收到了,但是没有通知栏出现,这时苹果就不允许了。苹果规定,当一条通知达到后,如果在30秒内,还没有呼出通知栏,我就系统强制调用self.contentHandler(self.bestAttemptContent) 来呼出通知栏。 这时想必大家都知道 serviceExtensionTimeWillExpire 函数的用途了吧

设置支持后台播放

  • 配置应用支持后台播放,这个只需要在Xcode中做下配置即可
image
image

这里需要注意:当勾上上面的配置后,可能会导致苹果审核不通过,这里我们可以在应用中添加一个语音播放的功能,并录制视频告知苹果用途,可能会过审。

iOS 10以下实现串行播报

核心代码如下


// 监听通知函数中调用添加数据到队列 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler { [self addOperation: @"语音文案"]; } #pragma mark -队列管理推送通知 - (void)addOperation:(NSString *)title { [[self mainQueue] addOperation:[self customOperation:title]]; } - (NSOperationQueue *)mainQueue { return [NSOperationQueue mainQueue]; } - (NSOperation *)customOperation:(NSString *)content { NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ AVSpeechUtterance *utterance = nil; @autoreleasepool { utterance = [AVSpeechUtterance speechUtteranceWithString:content]; utterance.rate = 0.5; } utterance.voice = self.voiceConfig; [self.synthConfig speakUtterance:utterance]; }]; return operation; } - (AVSpeechSynthesisVoice *)voiceConfig { if (_voiceConfig == nil) { _voiceConfig = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"]; } return _voiceConfig; } - (AVSpeechSynthesizer *)synthConfig { if (_synthConfig == nil) { _synthConfig = [[AVSpeechSynthesizer alloc] init]; } return _synthConfig; } 

注意事项

  • 上面的通知扩展类最低支持iOS系统为 10及10 以上,所以所 iOS10以下的系统,是不支持使用通知扩展的
  • 通知扩展文件中是不支持断点调试的,网上有说通过配置可以进行断点,可是我尝试了 很多次,还是不能断点,这里我的处理方式是,通过使用 临时的语音播报来代替断点,在需要断点的地方加一个语音播放,如果播报出来了,代表执行了此行
  • 上面我们介绍了speechSynthesizer:didFinishSpeechUtterance 语音播放完成的代理函数,可能有的小伙伴会遇到这个代理函数不执行的情况,这时我们需要将 AVSpeechSynthesizer 类的对象设置成全局属性即可。
  • iOS 10 以下的系统,我们也想实现同时多条通知的串行播报该怎么实现尼,我自己的做法是自己维护一个数组队列,具体的实现参照下面代码块。
  • content-avilable 字段的值,需要配置为 1
  • 添加支持后天播放时,可能会被苹果拒审
  • 如何实现扩展类和主工程之间的数据通信(这块内容会单独的出一篇文章来介绍)
  • 待补充

示例Demo

https://github.com/guangqiang-liu/iOS-NotificationExtensionDemo

总结

我们公司之前做的扫码支付需求,支付成功后播报支付金额,当时在开发这块需求时,遇到了杀进程无法进行语音播报的问题,后面引入了iOS10 的通知扩展类来解决杀进程问题。在使用扩展类时,也是遇到了不少的问题和大坑,这里就逐一做了下总结,上面的讲解也是填坑后的个人理解,如有错误之处,欢迎留言交流指出错误。

更多文章

  • 作者React Native开源项目OneM地址(按照企业开发标准搭建框架完成开发的):https://github.com/guangqiang-liu/OneM:欢迎小伙伴们 star
  • 作者简书主页:包含60多篇RN开发相关的技术文章http://www.jianshu.com/u/023338566ca5 欢迎小伙伴们:多多关注,多多点赞
  • 作者React Native QQ技术交流群:620792950 欢迎小伙伴进群交流学习
  • 友情提示:在开发中有遇到RN相关的技术问题,欢迎小伙伴加入交流群(620792950),在群里提问、互相交流学习。交流群也定期更新最新的RN学习资料给大家,谢谢大家支持!

欢迎小伙伴们扫下方二维码加入RN技术交流QQ群

QQ群二维码,500+ RN工程师在等你加入哦
QQ群二维码,500+ RN工程师在等你加入哦

欢迎小伙伴们扫下方二维码加入

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇@property & @synthesize & @dyna.. 下一篇OC字典的使用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目