记录一下前段时间的产品提出的坑爹需求。前段时间要求实现商家收款订单的语音播报功能, 并且要求实现的功能是点击APP进入后台或者APP进程杀死之后,依旧能收到语音播报,于是只能考虑苹果的推送扩展(Notification Service Extension), 在网上查找了一番教程之后,发现苹果在iOS12.1后就禁用了里面的AVAudioPlayer
于是开始了漫漫填坑之路,由于要求app后台也能播报,那么就只能使用推送进行。好在苹果虽然禁用了语音推送,但推送时的sounds我们还可以自定义(没错,就是我们平常微信听到的那声叮咚!)这个sounds有个最大播放时长,大概是在10s左右,所以语音文字不能太长,语速也尽量控制的快一点,我们是直接上万能的淘宝找人专门录了一套语音文件,包括xxx收款,个十百千万,1234567890等等这些。然后再根据收到的钱进行语音拼接合成。
之后又遇到个新的问题,推送扩展和主项目工程其实相当于两个独立的target,我们将语音文件放在主工程目录下,Notification Service Extension是无法直接访问声音文件的。---这个时候就需要用到APP Group了。下面是APP Group的介绍
- AppGroup allows data sharing between two different apps or even app and widgets by creating one common shared path (like document directory). Data saved over there can be accessed by any app which is associated with that particular AppGroup. It is an offline data sharing between apps.
这段苹果说明告诉我们:App Groups可以使两个不同的Target(或者APP与其Extension)之间进行数据共享。
AppGroup的创建也非常简单:
1.在Apple Developer中配置APP的App ID时,勾选AppGroups选项:
2.创建AppGroup
3.将APP Groups添加到APP ID中。回到步骤1创建的APP ID那里,可以看到APP Groups选项为黄色待编辑状态,点击Edit将步骤2创建的APP Groups添加进去
4.将APP Groups添加到Xcode工程中
这样处理好了之后就可以在NotificationServiceExtension里面愉快的访问声音文件了。之后我们只需要在NotificationServiceExtension解析推送数据,合成语音,播放即可。下面上代码,文中会有注释
PS:关于代码中的拼接播报语音,之前我们是想本地合成语音来着,但是由于收到推送后再临时去合成语音+播放,这个时间太短(推送的那声sounds也就10s~)怕来不及,就采用了先后台合成语音片段再推送过来的方式。并且安卓那边也采用后台合成的语音片段,便于两端统一。