You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:27:04