接上篇如何让iOS推送播放语音,之前的结论是iOS如果需要送审商店只能播放本地的mp3文件,这里更新一下:
更新
语音的播放,最终调用的方法是UNNotificationSound(named: xxx)
,而这个方法官方文档注释如下:
// The sound file to be played for the notification. The sound must be in the Library/Sounds folder of the app's data container or the Library/Sounds folder of an app group data container. If the file is not found in a container, the system will look in the app's bundle.
public convenience init(named name: UNNotificationSoundName)
注释里说,语音文件会从这三个地方查找:
APP 的
Library/Sounds
文件夹APP和 Extension共享Group的
Library/Sounds
文件夹App bundle
而之前文章里介绍的,就是属于第三种情况,直接放在App bundle
中的情况。这种情况的局限性在于,每次有新增或者变更,都需要变更同步到项目,然后APP发版用户更新后才能生效。
这种太麻烦了,有没有可能,不用更新版本,并且能直接增加新的语音种类,本篇介绍的就是这种。
实现
不更新版本,增加新的语音种类,就需要考虑,是否能在线下载?看上面的播放方法语音文件的查找目录,考虑是否可以通过在线下载语音文件到 APP 的Library/Sounds
文件夹 或者 APP和 Extension共享Group的Library/Sounds
文件夹下。
首先考虑第一种情况,如果想要下载到APP的Library/Sounds
文件夹下,要怎么做呢?直接在推送时配置下载链接是否可行?
笔者尝试的是,在Notification Service Extension
的target中,获取到配置的语音文件链接,然后下载,存储到Library/Sounds
文件夹下,下载成功后,再去播放。
验证后发现不可行,因为此时的目录不是APP的Library/Sounds
目录,而是推送Target的appex的Library/Sounds
目录,而这个目录不在语音文件的查找范围内,所以这种不可行?那如何下载到APP 的Library/Sounds
目录下呢?
下载到APP的Library/Sounds
笔者想到有两种可能方案:
推送时配置下载链接,在APP处理推送方法的地方,进行下载
单独接口配置下载链接,APP打开时调用,提前下载
首先方案一,APP 处理推送方法是在Notification Service Extension
的contentHandler
之后,而语音播报是在contentHandler
时,即,下载在播报之后,这种情况下,第一次的语音是播报不出来的;而且 APP 不打开的情况下,是否允许下载,是否能下载成功都未知,所以不可取。
再来看方案二