如何获知FCM推送通知无法发送?连续失败时怎么处理Token?
FCM推送失败检测与无效Token清理方案
一、FCM推送失败的获知方式
FCM的推送结果反馈需在服务器端处理(你当前的OnMessageReceived仅负责客户端成功接收通知后的逻辑,无法感知推送失败),核心有两种方式:
1. 同步API即时反馈
当服务器调用FCM发送API(HTTP v1 API或Legacy API)时,FCM会立刻返回响应,其中包含每个目标Token的状态:
- 返回
NotRegistered:对应设备已卸载应用、Token过期或无效,可直接标记删除 - 返回
InvalidRegistration:Token格式错误,直接删除 - 返回
Unavailable/InternalServerError:属于临时服务故障,可重试推送,不直接标记无效
示例响应(Legacy API):
{ "multicast_id": 123456, "success": 0, "failure": 1, "canonical_ids": 0, "results": [ { "error": "NotRegistered" } ] }
2. 异步送达报告(可选)
若需要更详细的送达数据(如是否被用户点击),可在发送请求中添加delivery_receipt_requested: true参数,开启FCM的送达报告功能,FCM会将推送结果异步发送到你指定的服务器端点。
二、连续失败Token的清理逻辑
- 新增统计字段:在你的
fcmtoken表中添加fail_count(失败次数)、last_fail_time(最近失败时间)字段,用于追踪每个Token的失败情况 - 失败处理规则:
- 每次调用FCM发送后,解析响应错误码:
- 若为
NotRegistered/InvalidRegistration:直接从表中删除该Token - 若为临时错误:将该Token的
fail_count加1
- 若为
- 定时扫描
fcmtoken表,当某个Token的fail_count达到设定阈值(如3次),且最近失败时间超过指定期限(如24小时),则删除该Token
- 每次调用FCM发送后,解析响应错误码:
三、关于你当前的OnMessageReceived方法
你提供的客户端代码仅负责成功接收FCM通知后的展示逻辑,与推送失败检测无关。若需在客户端维护Token有效性,可在应用启动时调用FirebaseInstanceId.Instance.Token获取最新Token,对比本地存储的旧Token,若不一致则上传至服务器更新fcmtoken表。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

