Flutter应用前台离线时接收多条Firebase通知计数仅增长一次如何解决?
FCM通知计数累加异常修复方案
根因定位
计数仅单次增长的核心原因通常有两个:
- FCM默认消息折叠策略:同一发件人短时间下发的多条通知默认会被标记为可折叠消息,无网期间缓存的多条同类型消息恢复网络后仅合并下发最后一条,只会触发一次
onMessage回调 - 计数逻辑竞态冲突:若计数变量采用普通读写方式,多条回调同时触发时会出现写覆盖,多次自增操作最终仅生效一次
修复方案
1. 关闭FCM消息折叠
服务端下发FCM消息时调整配置,保证每条消息独立投递:
- HTTP v1 API:消息体中添加
"collapse_key": null,按需配置ttl参数设置消息缓存有效期 - 旧版HTTP API:设置
collapse_key为空字符串,安卓端添加"priority": "high"、iOS端添加"content_available": true提升投递优先级,避免消息合并
2. 修复计数竞态问题
采用原子操作/函数式更新替代直接自增,避免多线程/多回调的写覆盖:
React示例:
// 错误写法 setCount(count + 1) // 正确写法 setCount(prevCount => prevCount + 1)
原生安卓可使用AtomicInteger存储计数值,iOS可使用系统提供的原子自增接口。
3. 新增消息去重兜底
每条FCM消息携带唯一message_id,本地维护已处理消息ID集合,避免同一条消息重复触发计数,也可避免漏计数:
// 全局存储已处理消息ID const processedMessageIds = new Set() messaging.onMessage(payload => { const currentMsgId = payload.messageId // 已处理过的消息直接跳过 if (processedMessageIds.has(currentMsgId)) return processedMessageIds.add(currentMsgId) // 执行计数更新 setCount(prev => prev + 1) })
可根据业务场景定期清空ID集合,控制内存占用。
内容的提问来源于stack exchange,提问作者Alisha Budhathoki
相关产品推荐
相关产品推荐

