iOS 开发每天分享优质文章

iOS语音播报和推送新特性和app Groups的初用

2018-10-28  本文已影响71人  樊开囧

这周收到一条bug反馈,接手项目里的收到推送之后语音播报的功能出了问题。在app里的设置页里关闭了“接收新消息声音提醒”的开关后,收到推送,仍然能够听见这条推送的语音播报。原以为这是个小问题,可以分分钟解决,却还是废了不少劲,所以存个档纪念一下。下图是我的推送的设置页:

设置页

然后去看代码了,项目中语音播报用的是IFlySpeechSynthesizer这个语音库,上面那个接收新消息声音提醒的开关所对应的值,保存在userdefault里。语音库提供了一个声音关键词“VOLUME”和设置方法,所以这边的代码是这样写的:

开关控制声音

逻辑没毛病。所以开始找语音的生成方法写在哪里了,希望能看出来是啥问题。最后在iOS推送新特性的一个分类里找到了生成方法,这个分类类名叫UNNotificationServiceExtension,方法名如下

新特性方法名

语音生成的方法就放在这个方法里。这个分类比较特殊,不能NSLog打印,断点也不走(有错,其实可以的)。通知内容的数据只通过这行代码获取:

通知内容

userInfo的数据结构同在appDelegate里设置的其中一个代理里获取到的内容一样。

接下来要做的事情有点眉目了,就是获取到上面的isOpen的值,做个判断就行,1生成语音,0不生成。可是后来通过语音播报isOpen这个值,发现不管isOpen在分类外是0是1,它在这个分类里的值一直都是null。所以,这个分类也不支持userdefault存取数据?这就比较难搞了。

后来也查了不少资料,最后终于发现主程序和Extensions可以通过appGroups共享数据,具体操作如下:

主程序 Extensions

userDefault的调用形式也要变一变:

保存 读取

使用的时候记得group的名字都要一致。这样子可以在分类中知道app里声音开关是否开启了。也就方便做判断语音是否要合成的操作了。操作如下:

语音合成并播放

分类里面,用的是系统自带的语音播报功能。测试了一下,问题解决了。

文末:现在技术和版本都更新的非常快,Extensions的功能也越来越多人在用了,希望这一篇文章可以帮到你。

上一篇下一篇

猜你喜欢

热点阅读