一、push 相关背景
1.push 整体架构
以接触最多的国内 Android 设备为例,整体结构如下:
2.厂商 push 和自建 push
厂商 push 通道:优点是通过各个 OS 厂商维护的长链接进行推送,在 App 被系统杀掉后也可以进行推送,推送到达率高于自建push。支持华为,小米,oppo,vivo等厂商。缺点是,目前厂商的push基本都只支持通知栏消息的推送,在用户点击通知前,不启动应用,对红点, 图片等消息格式支持有限。
自建push通道:通过App启动后和自建服务端的长连接通道实现推送,缺点也很明显,App被杀掉后,就无法收到信息。主要用于不支持厂商渠道场景下的push。
二、问题排查举例
通过上面的介绍,可以看出三方厂商 push 是否成功,主要取决于三个链路,分别为:
- 三方 token 正确生成上报
- 服务端正常转发到厂商服务器
- 下发到客户端消息可以正常显示
1.测试准备
为了快速验证问题,我们需要准备一个推送程序,可以快速推送信息到App上。MPS提供了推送的Http接口供外部调用,我们可以通过初始化一个简单的java程序实现推送信息的发送,方便联调。使用链接
2.三方 token 生成阶段
目前 mPaaS 对三方厂商 push 的 token 生成分为以下步骤。
2.1 设备在三方push的厂商列表里
以华为设备为例,判断是否是华为设备的标准是,检测当前手机是否是 emui,如果是才走华为 PUSH SDK。在我们日常运维的 case 中,发现过部分设备由于刷机或者其他操作,在华为手机上安装的不是 emui,类似这种设备是走不了华为 push 的,只能走自建 push。
以vivo设备为例,低版本手机只有在vivo公布的白名单设备内才支持推送。
2.2 生成三方 token
在调用 push sdk 生成 token 的过程中,由于 push sdk 的生成也依赖当前手机的 room 版本,以华为为例,就强依赖华为手机内置的 HMS Core 版本。针对这种场景下的问题,在获取三方 token 失败的时候,会在回调里返回对应错误码。如下图所示,搜索 push 的关键字 mPush14,然后过滤,可以获取 token 返回错误码2。
我们查看华为定义的错误码,发现2表示 SERVICE_VERSION_UPDATE_REQUIRED,需要升级当前的 HMS 版本。
升级HMS版本的方案有两个
方案1:主动升级,调用更新服务接口,升级更新效果如下所示:
1. 在启动阶段调用如下服务,安装更新华为推送服务
2. if (HuaweiApiAvailability.getInstance().isHuaweiMobileNoticeAvailable(context) == ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED) {
3. // 需要升级
4. HuaweiApiAvailability.getInstance().resolveError(activity, ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED, 1);
5. }
方案2: 引导用户去华为设置里去升级
2.3 三方 token 正常上报
生成 token 后会通过 RPC 接口上报到 MPS 服务端,需要检查 RPC 接口是否有异常,上报接口是:alipay.client.yunpushcore.device.report
2.4 token 过期
以 oppo 为例,是在应用第一次启动时注册生效,后在刷机、还原手机(设置-其他设置-还原手机)、卸载应用时会失效,需要重新注册才能推送。
3.服务端投送阶段
3.1 消息包含了红点,静默,群发
目前如果消息设置了红点或者静默,因为厂商 push 不支持,MPS 会自动走自建 push。
3.2 三方服务端报错
这种主要用作 mPaaS 服务端推送到三方服务端后,三方返回异常。这种需要去 MPS 拉取服务端报错日志,然后核对厂商文档解决,比如华为服务端报错文档。
3.3 三方服务端限流
以 vivo 为例,默认推送走的是运营消息,每天只能对同一个用户推送 5 次。只有改成系统 push 类型才能没有这个限制。
- 设备显示阶段
4.1 设备必须打开通知权限才能显示
比如 oppo 的通知权限默认是关闭的,需要打开通知权限,或者引导用户打开后才能显示。
4.2 应用包名和注册 oppo 配置保持一致
应用的包名要和注册 oppo 平台填写的包名要一致,不然不会显示。
三、其他常见问题
1.常用日志举例
1.1 tag:mPush14
主要是 mPaaS 上层应用层日志打印,打印 push 注册 token 相以及自建通道 push 相关信息。
1.2 tag: mcssdk
mcssdk 是 oppo push sdk 的日志 tag,可以查看厂商的一些日志信息,比如查看三方 token
2.其他思路
如果以上都解决不了,最后建议去看各个厂商的官方介绍,可能会找到一些思路。
END
延伸阅读