这周收到一条bug反馈,接手项目里的收到推送之后语音播报的功能出了问题。在app里的设置页里关闭了“接收新消息声音提醒”的开关后,收到推送,仍然能够听见这条推送的语音播报。原以为这是个小问题,可以分分钟解决,却还是废了不少劲,所以存个档纪念一下。下图是我的推送的设置页:
然后去看代码了,项目中语音播报用的是IFlySpeechSynthesizer这个语音库,上面那个接收新消息声音提醒的开关所对应的值,保存在userdefault里。语音库提供了一个声音关键词“VOLUME”和设置方法,所以这边的代码是这样写的:
逻辑没毛病。所以开始找语音的生成方法写在哪里了,希望能看出来是啥问题。最后在iOS推送新特性的一个分类里找到了生成方法,这个分类类名叫UNNotificationServiceExtension,方法名如下:
语音生成的方法就放在这个方法里。这个分类比较特殊,不能NSLog打印,断点也不走(有错,其实可以的)。通知内容的数据只通过这行代码获取:
userInfo的数据结构同在appDelegate里设置的其中一个代理里获取到的内容一样。
接下来要做的事情有点眉目了,就是获取到上面的isOpen的值,做个判断就行,1生成语音,0不生成。可是后来通过语音播报isOpen这个值,发现不管isOpen在分类外是0是1,它在这个分类里的值一直都是null。所以,这个分类也不支持userdefault存取数据?这就比较难搞了。
后来也查了不少资料,最后终于发现主程序和Extensions可以通过appGroups共享数据,具体操作如下:
userDefault的调用形式也要变一变:
使用的时候记得group的名字都要一致。这样子可以在分类中知道app里声音开关是否开启了。也就方便做判断语音是否要合成的操作了。操作如下:
分类里面,用的是系统自带的语音播报功能。测试了一下,问题解决了。
文末:现在技术和版本都更新的非常快,Extensions的功能也越来越多人在用了,希望这一篇文章可以帮到你。