Android 端推送问题排查
更新时间: 2024/10/29 18:13:56
网易云信 IM 即时通讯支持安卓推送平台。本节主要描述安卓推送流程以及推送失败后的排查方法。
概念
名词 | 解释 |
---|---|
厂家渠道 | 由华为,小米,魅族,vivo,oppo 等厂家提供的与设备之间的长连接,用于接收推送广播,产生通知栏。 |
证书 | 本质上是厂家后台提供的推送参数。 |
推送 Token
|
|
推送流程
问题排查
对应推送流程图,您可以按照本章节介绍的步骤进行排查。
在排查问题前,请确认您已经参照 实现离线推送 集成了推送功能。
步骤 1:检查项目推送 Token 是否生成
-
获取 SDK 日志。如何获取,请参考《FAQ》互动白板 SDK 在什么路径提取日志。
-
过滤日志中的
mix_push
字段。-
注册成功的日志。
-
注册失败的日志,注册失败无法获取 Token。一般打印的信息都是厂家推送 SDK 回调的,需要根据日志打印的信息在互联网上定位一下原因。
一般情况下,token 生成之后,只要 IM 登录是成功的,那么 Token 一定就正常上报到网易云信。
-
步骤 2:检查是否满足推送条件
具体触发消息推送的条件,请参考《FAQ》关于消息推送。
步骤 3:检查手机的通知栏权限是否开启置
安卓 8.0 开始加入推送 channel 的概念,所以建议在测试的时候将所有推送的 channel 都打开。
步骤 4:提交分析
如果 Token 已经正常生成,并且满足推送条件,但是设备依旧收不到推送通知栏,可以将 Token,SDK 日志,证书名称等信息 提交工单 联系网易云信技术支持工程师。
关于单击通知栏
-
参考 开发文档 的说明
-
华为自定义单击跳转。
华为推送提供一个 click_action 的字段,可以用于自定义通知栏跳转。具体请参考华为的 开发文档。
这里的
intent
内容可以在应用的launch activity
的getIntent
方法中获取到。下图中的notification
内容在实际发消息时,传在payload
的"hwField"内即可。
关于通知类型
有部分厂家会区分营销类通知和消息通知,可以考虑通过以下方式配置:
JSON{
// vivo 推送 可以自定义 https://dev.vivo.com.cn/documentCenter/doc/362#w2-98542835 里的传参
"vivoField":{
"classification":1, // 指定为系统消息
"category":"IM" // 二级分类
},
// oppo 推送 7.8.0 开始支持。可以自定义 https://open.oppomobile.com/wiki/doc#id=10688 中的参数
"oppoField":{
// 指定通道
"channel_id":"1233"
}
// 华为推送,可以自定义 https://developer.huawei.com/consumer/cn/doc/development/HMSCore-References/https-send-api-0000001050986197#section13271045101216 中的参数,目前支持的是其中 AndroidNotification 结构体
"hwField":{
"title":"friend",
"body":"heolo"
}
// 注意:小米的没有对应的 Field,各参数直接放在 payload 的第一级的键值对中
// 小米的通道 可以自定义 https://dev.mi.com/console/doc/detail?pId=1163#_0 中 extra 下的各个属性。
"channel_id":"123345",
// 可选项,指定在特定的网络环境下才能接收到消息。目前仅支持指定"wifi"。
"connpt":"wifi"
}
更多示例请参考 推送 payload 配置。
厂商通道限流
1. 小米通道
请访问 小米文档。
- 限制点:普通级别消息(默认),每天会限流。
- 解决:客户自行申请重要级别消息 并申请 channel,在发消息时,setPushPayload 中传{"channel_id":"12345"}。
2. 华为通道
请访问 华为文档。
- 限制点:每天向某个设备上某个应用发送消息的数量不超过 3000 条,超过 3000 条会进行限流。
- 解决:无法解决,华为不支持申请不限流以及增量,3000 条常规够用。
3. oppo 通道
请访问 oppo 文档。
- 限制点:公信通道(默认)可推送数量,每日推送总量有上限。
- 解决:客户自行申请私信通道,并申请 channel,在发消息时,
setPushPayload
中传{ "oppoField":{"channel_id":"12345"}}。
4. vivo 通道
请访问 vivo 文档。
- 限制点:运营消息(默认),单用户单应用每天收到的消息条数上限为 5 条。
- 解决:在发消息时,
setPushPayload
中传{ "vivoField":{"classification":1}},指定为系统消息。
如果系统消息量级不够用,需要向 vivo 申请增量。
SDK 通道 Channel
部分客户想直接使用 SDK 中注册的 channel,作为厂商(小米、oppo)的申请 channel。
SDK 中 channel 信息:
-
默认,有声音和震动
Java
// default channel private static final String NIM_CHANNEL_ID = "nim_message_channel_001"; private static String NIM_CHANNEL_NAME = "Instant messages channel"; private static String NIM_CHANNEL_DESC = "Instant messages notification";
-
免打扰,无声音无振动
Java
// no disturbing channel private static final String NIM_NO_DISTURBING_CHANNEL_ID = "nim_message_channel_002"; private static String NIM_NO_DISTURBING_CHANNEL_NAME = "No disturbing instant messages channel"; private static String NIM_NO_DISTURBING_CHANNEL_DESC = "No disturbing instant messages notification";
-
有声音无振动
Java
// just ring private static final String NIM_JUST_RING_CHANNEL_ID = "nim_message_channel_003"; private static String NIM_JUST_RING_CHANNEL_NAME = "Just ring channel"; private static String NIM_JUST_RING_CHANNEL_DESC = "Just ring instant messages notification";
-
无声音有振动
Java
// just vibrate private static final String NIM_JUST_VIBRATE_CHANNEL_ID = "nim_message_channel_004"; private static String NIM_JUST_VIBRATE_CHANNEL_NAME = "Just vibrate channel"; private static String NIM_JUST_VIBRATE_CHANNEL_DESC = "Just vibrate instant messages notification";
厂商通道错误码文档
厂家 | 错误码 |
---|---|
小米 | 客户端错误码、服务端错误码 |
华为 | 客户端错误码、服务端错误码 |
oppo | 客户端错误码、服务端错误码 API,见 ReturnCode.ErrorCode |
vivo | 客户端和服务端错误码 |
魅族 | 客户端错误码、服务端错误码 |
荣耀 | 客户端错误码 |
FCM | 错误码 |
常见问题
我如何知道我使用的 IM SDK 该配套使用平台厂商的推送渠道哪个版本的 SDK?
请参考 实现离线推送 查看 SDK 之间的兼容情况。