语音播报完成的函数,我们将 呼出通知栏的代码 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
这里需要注意:当勾上上面的配置后,可能会导致苹果审核不通过,这里我们可以在应用中添加一个语音播放的功能,并录制视频告知苹果用途,可能会过审。
iOS 10以下实现串行播报
核心代码如下
注意事项
- 上面的通知扩展类最低支持iOS系统为 10及10 以上,所以所 iOS10以下的系统,是不支持使用通知扩展的
- 通知扩展文件中是不支持断点调试的,网上有说通过配置可以进行断点,可是我尝试了 很多次,还是不能断点,这里我的处理方式是,通过使用 临时的语音播报来代替断点,在需要断点的地方加一个语音播放,如果播报出来了,代表执行了此行
- 上面我们介绍了
speechSynthesizer:didFinishSpeechUtterance
语音播放完成的代理函数,可能有的小伙伴会遇到这个代理函数不执行的情况,这时我们需要将 AVSpeechSynthesizer
类的对象设置成全局属性即可。
- iOS 10 以下的系统,我们也想实现同时多条通知的串行播报该怎么实现尼,我自己的做法是自己维护一个数组队列,具体的实现参照下面代码块。
content-avilable
字段的值,需要配置为 1
- 添加支持后天播放时,可能会被苹果拒审
- 如何实现扩展类和主工程之间的数据通信(这块内容会单独的出一篇文章来介绍)
- 待补充
示例Demo
https://github.com/guangqiang-liu/iOS-NotificationExtensionDemo
总结
我们公司之前做的扫码支付需求,支付成功后播报支付金额,当时在开发这块需求时,遇到了杀进程无法进行语音播报的问题,后面引入了iOS10 的通知扩展类来解决杀进程问题。在使用扩展类时,也是遇到了不少的问题和大坑,这里就逐一做了下总结,上面的讲解也是填坑后的个人理解,如有错误之处,欢迎留言交流指出错误。
更多文章
欢迎小伙伴们扫下方二维码加入RN技术交流QQ群
QQ群二维码,500+ RN工程师在等你加入哦
欢迎小伙伴们扫下方二维码加入