请按照如下思路排查:
1. 完成公共前提检查。
2. 区分推送类型:消息服务推送(调 IM SDK 发送的聊天消息),或全员/标签/指定用户推送(在腾讯云控制台或调 Server API 发送的运营消息)。
3. 区分在线、离线,其中离线问题最后按排查工具的查询结果,进入离线通知链路排查。
公共前提检查
在线通知和离线通知都要满足以下条件。任一项不满足,两类通知都收不到。
1. 该 SDKAppID 已开通 Push 服务。如果 Chat 和 Push 都需要且开通,两者必须使用同一个 SDKAppID,见 Chat 与 Push 混用说明。
2. 客户端已接入 TIMPush,且
registerPush 成功。只接入 Chat、未接入 TIMPush 时,在线聊天消息能到达 App,但不会弹出系统通知。3. 使用真机,且设备已打开该应用的系统通知权限。Android 13 及以上需要在运行时申请通知权限;部分品牌(例如 OPPO)安装后通知默认关闭。
按推送类型、在线/离线状态初步排查
请按推送类型选择:
如果能明确接收方 App 的在线、离线状态:
消息到达时接收方 App 在前台,走在线通道,按下方收不到在线通知排查;
App 在后台或已被强制停止,走离线通道,按下方收不到离线通知排查。
如果无法确定接收方 App 的在线、离线状态:
查得到这条消息:走的是离线通道。
查不到这条消息:
单端登录时,说明接收方当时在线。
多端登录时不能据此判断,只能查询最后一个登录的设备的数据,收不到通知的设备如果不是最后登录的那台,查不到不代表它走了在线通道。此时让该设备最后登录,再重新发送一条消息查询。
在线推送是否弹出系统通知由 TIMPush 决定,不经过厂商通道,不需要厂商证书,也不受手机品牌限制。
注意:
在线通知不会出现在推送记录中,无法用排查工具排查。
测试时,发送方和接收方请使用两个不同的 UserID。同一个 UserID 登录两台设备、从一台发给另一台时,接收设备收到的是自己所发消息的多端同步,不会弹出通知。
步骤 1:检查前台通知开关
未调用前台通知开关(Android / iOS)时,Chat 场景(只用 Chat,或 Chat 与 Push 混用)前台默认不弹通知,需调用该接口并传
false/NO 开启。已调用该接口并传 true/YES 时,前台不弹通知是预期行为。步骤 2:检查发送端的推送信息
发送端调用
sendMessage 发送消息时,必须传入 V2TIMOfflinePushInfo 参数,并设置 title 或 desc(至少一个不为空)。两者都为空时不弹通知。文本、图片、自定义等各类消息都按此要求设置。步骤 3:检查 onRecvPushMessage 回调
在线消息会触发
onRecvPushMessage。收不到回调时检查:1.
V2TIMOfflinePushInfo 的 title、desc、ext 不能都为空,否则不触发回调。2. TIMPush 与 IM SDK 版本需要一致。
步骤 1:在排查工具中查询这条推送
1. 在 推送记录 的消息服务推送页签中,按发送者 ID、接收者 ID 和时间窗口找到这条推送,复制 Push ID,在排查工具中查询。多端登录时只能查到最后一个登录的设备的数据,测试时让收不到通知的设备最后登录。
2. 推送记录里查不到这条推送时,重点检查步骤 2 和步骤 3。
步骤 2:检查发送端的推送信息
1. 发送端调用
sendMessage 时传入 V2TIMOfflinePushInfo 参数,且 disablePush 为 false。2. 自定义消息必须设置
V2TIMOfflinePushInfo 的 desc,否则不推送。步骤 3:检查 UserID 绑定
接收方须曾经 IM 登录并完成
registerPush,设备 Token 已绑定该 UserID。发送时不要求接收方在线。用户退出 IM 登录后绑定失效,需重新登录并再次调用 registerPush。步骤 4:检查离线通知链路
在 推送记录 的全员/标签/指定用户推送页签中复制这条推送的 Task ID,再在 排查工具 中输入 Task ID 和接收方 UserID 查询。推送状态在提交即时通信 Push 服务器之后分为两条链路:
1. 提交在线通道 > 消息推送至设备 > 用户点击:走在线通道,按下方收不到在线通知排查。
2. 提交离线通道 > 提交厂商通道 > 消息推送至设备 > 用户点击:走离线通道,按下方收不到离线通知排查。
在线推送是否弹出系统通知由 TIMPush 决定,不经过厂商通道,不需要厂商证书,也不受手机品牌限制。
步骤 1:检查前台通知开关
未调用前台通知开关(Android / iOS)时,单独使用 Push、未登录 IM 的 App 前台默认弹通知;与 Chat 混用、用 IM UserID 注册推送的 App 前台默认不弹,需调用该接口并传
false/NO 开启。已调用该接口并传 true/YES 时前台不弹通知是预期行为。步骤 2:检查 onRecvPushMessage 回调
在线推送会触发
onRecvPushMessage。收不到回调时,确认 TIMPush 与 IM SDK 版本一致。步骤 1:检查推送目标绑定
1. 按 RegistrationID 推送:不要求 IM 登录,
getRegistrationID 返回的值须与推送目标一致。2. 按 UserID 推送:接收方须曾经 IM 登录并完成
registerPush,设备 Token 已绑定该 UserID。用户退出 IM 登录后绑定失效,需重新登录并再次调用 registerPush。步骤 2:检查离线通知链路
注意:
复现问题时,一定要把 App 控制在明确的状态:测在线通知时让 App 停在前台,测离线通知时先把 App 切到后台或强制停止,再发送消息。
离线通知链路排查
设备情况异常:检查厂商注册
对应现象:设备情况显示 token 未绑定或通知栏开关关闭,或客户端
registerPush 失败。1. 通知栏开关关闭:在系统设置中打开该应用的通知权限后重新发送。
2. 已集成该品牌对应的 TIMPush 厂商包。Android 的
timpush-configs.json 已放在应用模块的 assets 目录,且是包含当前厂商证书的最新版本;华为 agconnect-services.json、荣耀 mcs-services.json 放在 App 模块根目录。3.
registerPush 成功,且 getRegistrationID 非空。见 控制台提示 RegistrationID 或 UserID 不存在,如何处理。4. Android 报
800005 或 800006:见 registerPush 报错 800005、800006 或 800008,如何处理。800006 表示本机通道注册失败且 FCM 兜底也失败,与下发阶段的厂商错误码不是同一层。各品牌的注册问题:
品牌 | 现象 | 处理 |
华为 | 日志为 Huawei appId missing、client/app_id 为空或找不到 agconnect-services.json | |
华为 | 厂商注册成功,但 registerPush 仍返回 800006,日志为 Huawei token empty | 项目中引入的第三方库可能影响 Token 获取。已知 com.github.ihsanbal:LoggingInterceptor 会导致该问题,日志通常包含 HMS token within 24h, not allowed apply hms token.。建议新建空项目测试,排除其他第三方库的干扰。见 华为设备注册失败且 Token 为空,如何处理。 |
荣耀 | 找不到 com.hihonor.mcs:push | 业务依赖 com.tencent.timpush:honor,com.hihonor.mcs:push 由该依赖拉取。检查荣耀 Maven,不要改配 HarmonyOS 仓库。 |
荣耀 | 注册失败 | mcs-services.json 放在 App 模块根目录,包名与荣耀应用一致。 |
小米 | 日志为 can't find service : TIMXiaoMiPushPlugin | 未集成 com.tencent.timpush:xiaomi,或被裁剪、未打进当前 flavor。与华为 Huawei token empty 的 800006 不是同一原因。 |
魅族 | 注册失败 | 检查依赖和 timpush-configs.json。 |
Google FCM | 本机通道注册失败后返回 800006 | |
HarmonyOS | 沿用 Android 方案收不到推送 | |
三星、中兴、传音等 | 没有离线通知 | 这些品牌没有独立厂商离线通道,不能按华为、小米方式配置厂商通知。若必须做离线系统通知,评估设备上实际可用的通道,例如具备 GMS 时的 FCM。在线通知不受影响。 |
「提交离线通道」报错:检查后台证书
对应现象:「提交离线通道」报错。
1. 控制台已上传该平台的厂商证书。
2. 证书中的包名或 Bundle ID 与当前安装包一致。
3. 改过 Android 包名或 iOS Bundle ID:在控制台新增对应证书,不要替换旧证书。新旧安装包分别使用各自的证书 ID(businessID)。
4. iOS:APNs 环境与安装包一致。Xcode 直接 Run 的 Debug 包走开发环境,Archive 发布包走生产环境,控制台证书或 p8 的环境、服务端推送环境须与该包一致。不一致时,控制台会提示 Token 与证书不匹配,服务端可能返回
bad devicetoken。证书过期、未打开 Push Notifications、描述文件缺少正确的 aps-environment,也会导致注册或下发失败。详情请参见 iOS 厂商配置。5. HarmonyOS:IM 控制台上传的是华为 API Console 的 Service Account JSON,不是应用签名用的
.cer。详情请参见 HarmonyOS 厂商配置。「提交厂商通道」报错:检查厂商下发
对应现象:「提交厂商通道」报错。
消息服务推送可在排查工具「报错信息」中查看厂商错误码和解决方案,并在「厂商信息」中核对 ChannelID、Category 是否与配置一致。再检查以下各项:
消息分类与模板:消息服务推送按厂商要求申请私信或通讯类分类,全员/标签/指定用户推送按消息真实类型选择分类。控制台和发送参数里的 Category、ChannelID、模板 ID 与厂商后台一致。
配额:未接入消息分类的消息走默认通道或公信通道,有单日条数限制,请核对。
上架:部分厂商要求应用已上架对应应用市场,请核对。
发送时段:部分厂商的运营消息在夜间会被丢弃,请核对。
各品牌的下发问题:
品牌 | 现象或错误码 | 处理 |
华为 | 消息被降级或限频 | |
荣耀 | 杀进程后收不到 | |
小米 | 单设备单日仅收到 1 条 | |
小米 | 错误码 10016,信息为 template_id is empty | 未配置模板 ID,或模板 ID 与 ChannelID 不是同一套私信模板。 |
小米、vivo | 未上架对应应用市场 | |
OPPO | 消息分类配置 | |
OPPO | 错误码 67,信息为 private classify channel need permission | 没有私信或通讯与服务通道权限。不要继续填私信分类;测试可走内容与营销类,并到 OPPO 开放平台确认权益。 |
OPPO | 强提醒不生效 | notify_level=16 为横幅强提醒,须先向 OPPO 申请,未开通不要填 16。内容与营销类只能为 1。配置 notify_level 时必须同时配置 category。 |
vivo | 消息分类配置 | |
vivo | 错误码 10302 | UserID 不存在、推送绑定失效,或测试设备未加入 vivo 测试设备集。 |
vivo | 夜间收不到、白天可以 | |
魅族 | 下发失败 | |
HarmonyOS | 消息分类配置 |
已推送至设备但没看到:检查设备展示
对应现象:「消息推送至设备」已完成,但用户没有看到通知;或后台能收到,仅强制停止后收不到。
1. 通知栏没有记录:检查该应用的通知类别或通知渠道是否被关闭。
2. 通知栏有记录、锁屏不弹:检查锁屏通知开关。
3. 仅强制停止后收不到:部分厂商系统对被强制停止的应用有限制,需开启自启动、后台运行等权限,属于厂商系统策略,请核对。
各品牌的展示问题:
品牌 | 现象 | 处理 |
华为 | 已送达、锁屏不弹 | |
小米 | 已送达、锁屏不弹 | 检查锁屏通知、通知类别和 MIUI 锁屏开关。 |
OPPO | 没有通知或锁屏不弹 | 安装后通知常默认关闭,先打开该应用通知开关。锁屏不弹时,先区分通知栏无记录还是有记录无弹窗,再查锁屏通知。 |
提交工单前准备的信息
1. SDKAppID。
2. 推送类型(消息服务推送,或全员/标签/指定用户推送),Push ID 或 Task ID,接收方 UserID 或 RegistrationID,以及发送时间(精确到分钟)。
3. 发送方式:客户端发送 IM 消息、REST API 或控制台。
4. 设备品牌、机型、系统版本,App 当时的状态(前台、后台或已强制停止),以及该 UserID 是否多端登录。
5. 客户端
registerPush 的回调结果和相关日志。6. 排查工具的查询结果截图。