Android 端推送问题排查
更新时间: 2024/03/14 16:36:29
云信IM即时通讯支持安卓推送平台。本节主要描述安卓推送流程以及推送失败后的排查方法。
概念
名词 | 解释 |
---|---|
厂家渠道 | 由华为,小米,魅族,vivo,oppo等厂家提供的与设备之间的长连接,用于接收推送广播,产生通知栏。 |
证书 | 本质上是厂家后台提供的推送参数。 |
推送 Token
|
|
推送流程
问题排查
在排查问题前,请检查是否按照开发文档集成推送功能。
对应推送流程图,问题排查的步骤如下:
步骤1:检查项目推送 token 是否生成
- 获取 sdk 日志。如何获取,请参见:https://faq.yunxin.163.com/kb/main/#/item/KB0179/1
- 过滤日志中的
mix_push
字段。
-
注册成功的日志。
-
注册失败的日志,注册失败无法获取 token 。一般打印的信息都是厂家推送 SDK 回调的,需要根据日志打印的信息在互联网上定位一下原因。
一般情况下,token 生成之后,只要 IM 登录是成功的,那么 token 一定就正常上报到云信。
步骤2:检查是否满足推送条件
具体触发消息推送的条件,请参见:https://faq.yunxin.163.com/kb/main/#/item/KB0065/1-1
步骤3:检查手机的通知栏权限是否开启置
安卓 8.0 开始加入推送 channel 的概念,所以建议在测试的时候将所有推送的 channel 都打开。
步骤4:提交分析
如果 token 已经正常生成,并且满足推送条件,但是设备依旧收不到推送通知栏,可以将 token ,sdk 日志,证书名称等信息提交工单,由技术支持排查。
工单提交:https://app.yunxin.163.com/index#/issue/submit
关于点击通知栏
-
参考开发文档的说明
-
华为自定义点击跳转
华为推送提供一个click_action的字段,可以用于自定义通知栏跳转。具体请参见华为的开发文档。
这里的
intent
内容可以在应用的launch activity
的getIntent
方法中获取到。下图中的notification
内容在实际发消息时,传在payload
的"hwField"内即可。
关于通知类型
有部分厂家会区分营销类通知和消息通知,可以考虑通过以下方式配置:
{
// 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 信息:
- 默认,有声音和震动
// 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";
- 免打扰,无声音无振动
// 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";
- 有声音无振动
// 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";
- 无声音有振动
// 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 | 错误码 |