我们正在使用OneSignal将推送通知发送到使用我们的应用程序的设备。我正在将其转换为FCM,除我遇到一个问题外,该过程几乎没有任何困难。如果我将新的APK(v2.8)安装在安装了应用程序当前版本(v2.7)的设备上,则通知声音不起作用。它振动但没有声音(我们使用2种自定义声音)。如果随后我清除了数据,即通过“设置/应用../存储/清除数据”,则声音开始按预期工作。如果我安装在尚未安装应用程序的设备上,则它可以正常运行。在运行Oreo和Pie的设备上,这似乎只是一个问题。我有没有问题的Samsung S4 Mini。
此外,在发送测试推送通知后深入研究logcat时,我看到以下错误:
2019-03-27 11:02:40.978 5019-21507 /? E / FileSource:无法打开文件“ android.resource://staffsync.reliever/2131492871”。 (没有这样的文件或目录)
使用APK分析器,我发现资源ID 2131492871实际上属于测试通知试图播放的原始声音文件,但是以前版本的APK(即此安装更新的版本) -v2.7。
为什么要尝试访问旧资源?
TIA有任何想法。
答案 0 :(得分:0)
我不确定这是答案还是问题。我从Secolink Eu和Steve Strates得到了一些线索。
通过在Android Studio中的APK分析器中进行挖掘,尤其是resources.arsc文件夹,我发现资源得到了系统的分配ID-每个给定类型的资源都将以相同的前4个数字在一个序列中,例如0f0d,最后4个是通过类型中资源名称/文件名的字母顺序分配的,因此,如果我的res / raw文件夹中有a.mp3,b.mp3和c.mp3,它们将被分配为0f0d001、0f0d002和0f0d003。在此示例中,如果前面的res类型是menu,则它将具有0f0c系列资源ID,而后续类型(字符串)将具有0f0e。
如果您的基础文件夹/文件结构在构建之间没有变化,那么从一个构建到下一个构建,最终您将获得相同的ID ...容易
但是在我的最新版本中,所有原始资源都从0f0c开始,在上一个版本中,它们的原始资源都从0f0d开始,在旧版本中,我删除了一个没有任何内容的res / menu文件夹。该文件夹分配了0f0c ID。
如此看来,新版本将无法播放声音,因为该设备正在使用0f0dxxxx ID访问完全不同的资源类型。由于Oreo / Pie的安全性更改,我认为即使在更新后也可以保留。
如果我放回已删除的res / menu文件夹,并将res / raw文件夹恢复到原来的状态(我删除了一些我们未使用的声音),那么我的新版本将按预期工作。安装新的应用程序后,我们可以让用户手动清除其数据,此问题已解决,但我们有数千名用户,其中许多人不知道该怎么做,因此他们会给予支持,而那些成功的人无法记住他们的登录详细信息,因此他们无法获得支持。
对于Oreo和Pie,这似乎是一个很大的限制,我知道它们正在保护用户的首选项,但也许安装过程应该提供允许通知资源更改的选项,否则我应该做的事情做错了吗?声音文件在其他地方?