如何调试Firebase Cloud Messaging?如何通过message_id查询消息状态?
如何调试Firebase Cloud Messaging?
调试FCM得从客户端到服务器端一步步排查,我整理了几个关键环节:
客户端侧排查
- 先确认设备token有效性:用
FirebaseMessaging.getInstance().getToken()(新版)获取当前设备的token,和你发送请求时用的token对比,确保完全一致——很多时候问题就出在token写错或者过期。 - 查看客户端日志:Android打开Logcat,过滤
FirebaseMessaging标签;iOS看Xcode控制台的FCM相关输出,重点找接收消息时的错误提示,比如权限未开启(iOS要确认推送权限、Android要开通知和后台权限)、消息处理逻辑报错。 - 先测前台接收:把应用放在前台,发送测试消息,看
onMessageReceived(Android)或didReceiveRemoteNotification(iOS)是否触发——如果前台能收到,那大概率是后台推送的配置问题(比如Android的后台通道设置、iOS的APNs配置)。
- 先确认设备token有效性:用
服务器侧排查
- 检查请求payload格式:FCM对通知消息和数据消息的格式要求不同,通知消息必须包含
notification字段,数据消息放在data里,混合消息两者都要有。如果是主题推送,确认主题名称拼写正确;设备组推送的话,设备组ID要有效。 - 验证服务器密钥:请求头里的
Authorization: key=你的服务器密钥必须正确,这个密钥在Firebase控制台「项目设置」→「云消息传递」里找,别误用Web API密钥(那是给客户端SDK用的)。 - 解析响应细节:别只看有没有
message_id,还要留意响应里的其他字段——比如如果有error字段,会直接告诉你问题(比如InvalidRegistration表示token无效);有些时候即使返回message_id,也可能存在隐性问题(比如token已过期但FCM还没标记)。
- 检查请求payload格式:FCM对通知消息和数据消息的格式要求不同,通知消息必须包含
已发送消息获成功响应但手机没收到,如何通过message_id查询状态?
这种情况确实头疼,不过FCM提供了两种方式查询消息状态:
Firebase控制台UI渠道
- 打开Firebase控制台,进入你的项目,找到「云消息传递」模块,点击「消息历史记录」。这里会列出你近期发送的所有消息,你可以通过发送时间、目标类型(设备/主题/设备组)筛选,找到对应的
message_id后点击进入详情页。 - 详情页里能看到消息的送达数、展示数、点击数,还有失败原因的统计(比如设备未注册、权限不足、设备离线等),甚至能看到单条消息的处理日志。注意:消息历史记录仅保留30天,超过时间就查不到了。
- 打开Firebase控制台,进入你的项目,找到「云消息传递」模块,点击「消息历史记录」。这里会列出你近期发送的所有消息,你可以通过发送时间、目标类型(设备/主题/设备组)筛选,找到对应的
Firebase CLI工具渠道
- 如果你习惯用命令行,可以用Firebase CLI的
messaging:message:get命令来查询,格式如下:
执行后会返回该消息的完整状态信息,包括每个目标设备的处理结果、错误代码(如果有失败的话)。firebase messaging:message:get YOUR_MESSAGE_ID --project=YOUR_PROJECT_ID - 前提是你已经安装了Firebase CLI,并且通过
firebase login登录,关联了对应的项目。
- 如果你习惯用命令行,可以用Firebase CLI的
补充说明
- 有时候即使返回
message_id,也可能因为设备处于离线状态、token过期/无效、Android设备进入Doze模式、iOS设备开启低功耗模式导致消息延迟或无法送达,这些情况在查询结果里都会有明确的状态提示。
- 有时候即使返回
内容的提问来源于stack exchange,提问作者Tolik Kukul
相关产品推荐
相关产品推荐

