Android

Android 端推送问题排查

更新时间: 2024/03/14 16:36:29

云信IM即时通讯支持安卓推送平台。本节主要描述安卓推送流程以及推送失败后的排查方法。

概念

名词 解释
厂家渠道 由华为,小米,魅族,vivo,oppo等厂家提供的与设备之间的长连接,用于接收推送广播,产生通知栏。
证书 本质上是厂家后台提供的推送参数。
推送 Token
  • 推送 token 是一个总称,是安卓设备上特定 app 的推送唯一 ID ,厂家推送服务器收到请求之后,会推送至相应的安卓设备,并展示设备上相应应用的通知栏。
  • 不同的厂家对 token 的称呼不同,如小米叫 regid ,华为叫 token 等。

推送流程

安卓推送流程图.png

问题排查

在排查问题前,请检查是否按照开发文档集成推送功能。

对应推送流程图,问题排查的步骤如下:

步骤1:检查项目推送 token 是否生成

  1. 获取 sdk 日志。如何获取,请参见:https://faq.yunxin.163.com/kb/main/#/item/KB0179/1
  2. 过滤日志中的 mix_push 字段。
  • 注册成功的日志。

    过滤1.png

    过滤2.png

  • 注册失败的日志,注册失败无法获取 token 。一般打印的信息都是厂家推送 SDK 回调的,需要根据日志打印的信息在互联网上定位一下原因。

    注册失败.png

一般情况下,token 生成之后,只要 IM 登录是成功的,那么 token 一定就正常上报到云信。

步骤2:检查是否满足推送条件

具体触发消息推送的条件,请参见:https://faq.yunxin.163.com/kb/main/#/item/KB0065/1-1

步骤3:检查手机的通知栏权限是否开启置

安卓 8.0 开始加入推送 channel 的概念,所以建议在测试的时候将所有推送的 channel 都打开。

安卓缩放.png

步骤4:提交分析

如果 token 已经正常生成,并且满足推送条件,但是设备依旧收不到推送通知栏,可以将 token ,sdk 日志,证书名称等信息提交工单,由技术支持排查。

工单提交:https://app.yunxin.163.com/index#/issue/submit

关于点击通知栏

  • 参考开发文档的说明

  • 华为自定义点击跳转

    华为推送提供一个click_action的字段,可以用于自定义通知栏跳转。具体请参见华为的开发文档

    这里的 intent 内容可以在应用的 launch activitygetIntent 方法中获取到。下图中的 notification 内容在实际发消息时,传在 payload 的"hwField"内即可。

    华为回调.png

关于通知类型

有部分厂家会区分营销类通知和消息通知,可以考虑通过以下方式配置:

{
    // 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 错误码
此文档是否对你有帮助?
有帮助
去反馈
  • 概念
  • 推送流程
  • 问题排查
  • 关于点击通知栏
  • 关于通知类型
  • 厂商通道限流
  • SDK通道Channel
  • 厂商通道错误码文档