这是篇过程复盘类的文章,一是想将问题的排查、解决过程梳理出来;二是要将排查过程中涉及到的一些琐碎的知识点记录下来。在开始复盘前,简单交代一下问题背景:我维护的项目基于【网易云信】实现了 IM 功能,与微信类似,用户收到消息后,手机会收到消息推送,状态栏和桌面 LOGO 的角标都会有消息提醒,最近有华为手机用户反馈没有消息提醒了,于是开始了下面的排查过程。
1. 问题描述
本次排查的问题为,华为手机用户在收到 IM 消息后,桌面 LOGO 的角标不发生动态更新,只有进入应用的消息列表页面,再重新切到桌面后角标数量才会更新。
2. 排查过程
2.1 角标权限
桌面图标的角标数量不更新,我们第一时间想到的是用户的「桌面图标角标」权限是否开启?结果是开启的,那就证明问题不在角标权限这里。
2.2 模拟复现
排除了角标权限,我们准备了两台华为手机,安装应用后开始互发消息。结果,两台手机的状态栏均可收到消息提醒,但角标数量依然没有更新。通过这样的测试,我们可以得到以下结论:
编号 | 结论 |
---|---|
1 | 客户端的消息推送逻辑没有问题 |
2 | 角标更新的问题应该在代码层面 |
2.3 官方沟通
在确定问题在代码层面后,我们拿着结论寻求云信技术组的支持,提供了样本消息的参数后,云信技术组反馈说消息体的 payload
中缺少华为 badge
的配置。同时提供了参考文档:
编号 | 文档 | 来源 |
---|---|---|
1 | 华为角标配置方法 | 云信 |
2 | AndroidNotification 结构 | 华为 |
3 | BadgeNotification 结构体 | 华为 |
于是按照文档说明,在 payload
的 hwField
节点下增加了 badge
配置,代码如下:
1 | HashMap<String, Object> hwPush = new HashMap<>(); |
重新编译打包安装到两台华为手机上进行消息互发测试,结果和之前的测试结果一样,依然是状态栏有提醒而角标数量无更新。结果提交给云信技术组,技术组的人也一头雾水。云信技术组收集了消息样本参数提交给了华为进行咨询,得到的反馈是:应用入口 Activity 类的全路径错误所致,也就是 badge
中的 class
值设置错误了。
因为这个值需要和云信后台证书中设置的 Activity 保持一致,于是和云信后台证书进行了比较,结果是一致的,唯一的变化是证书中配置的 Activity 已经不是项目中的应用入口了。区别如下:
位置 | 应用入口 |
---|---|
项目应用入口 | com.user.MainActivity |
证书配置入口 | com.user.LoginActivity |
![]() |
说明:这里需要说明下,应用入口的变更是业务需求变更导致的,应用入口变更后,对应的配置未及时更新。
现在,能想到的最直接的解决办法就是直接更新证书中的应用入口。但是,在尝试更新的时候,提示需要变更证书。这种操作容易影响线上的应用,所以,这个解决办法只能作为备选方案。经过和官方的确认,可以不更改云信证书的应用入口,只变更 badge
节点内的应用入口即可,因为 payload
的优先级是最高的,且高于云信证书。
3. 修复问题
现在可以放心的修复问题了,只需要将项目中的入口配置为最新的入口即可,代码如下:
1 | HashMap<String, Object> hwPush = new HashMap<>(); |
修改代码,重新编译运行到两台华为手机上并互发消息,角标数量可以正确更新了。此时,只是实现了安卓手机间发送消息时角标的更新,如果从 iOS、PC、WEB 端发消息到 Android 端实现角标的正确更新,也需要分别在这些端上配置对应的 payload
信息。