iOS大咖说

iOS后台语音播报技术实现

2021-02-18  本文已影响0人  安勒个安
记录一下前段时间的产品提出的坑爹需求。前段时间要求实现商家收款订单的语音播报功能, 并且要求实现的功能是点击APP进入后台或者APP进程杀死之后,依旧能收到语音播报,于是只能考虑苹果的推送扩展(Notification Service Extension), 在网上查找了一番教程之后,发现苹果在iOS12.1后就禁用了里面的AVAudioPlayer image.png

于是开始了漫漫填坑之路,由于要求app后台也能播报,那么就只能使用推送进行。好在苹果虽然禁用了语音推送,但推送时的sounds我们还可以自定义(没错,就是我们平常微信听到的那声叮咚!)这个sounds有个最大播放时长,大概是在10s左右,所以语音文字不能太长,语速也尽量控制的快一点,我们是直接上万能的淘宝找人专门录了一套语音文件,包括xxx收款,个十百千万,1234567890等等这些。然后再根据收到的钱进行语音拼接合成。

之后又遇到个新的问题,推送扩展和主项目工程其实相当于两个独立的target,我们将语音文件放在主工程目录下,Notification Service Extension是无法直接访问声音文件的。---这个时候就需要用到APP Group了。下面是APP Group的介绍

AppGroup的创建也非常简单:
1.在Apple Developer中配置APP的App ID时,勾选AppGroups选项:


image.png

2.创建AppGroup


image.png
3.将APP Groups添加到APP ID中。回到步骤1创建的APP ID那里,可以看到APP Groups选项为黄色待编辑状态,点击Edit将步骤2创建的APP Groups添加进去
image.png
4.将APP Groups添加到Xcode工程中
image.png 处理好了APPGroup之后。检查项目工程目录应该会是这样子 image.png

这样处理好了之后就可以在NotificationServiceExtension里面愉快的访问声音文件了。之后我们只需要在NotificationServiceExtension解析推送数据,合成语音,播放即可。下面上代码,文中会有注释


image.png
image.png

PS:关于代码中的拼接播报语音,之前我们是想本地合成语音来着,但是由于收到推送后再临时去合成语音+播放,这个时间太短(推送的那声sounds也就10s~)怕来不及,就采用了先后台合成语音片段再推送过来的方式。并且安卓那边也采用后台合成的语音片段,便于两端统一。

最后总结一下逻辑实现,通过Notification Service Extension实现后台播报,通过AppGroups实现声音文件访问。最后再通过修改推送sounds实现播报语音的目的。缺点是语音不能太长,所以字尽量精简,播报文件的语速尽量放快。另外,项目采用极光推送,需要将mutable-content设置为1才可生效

上一篇 下一篇

猜你喜欢

热点阅读