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

如何阻止Firebase Cloud Messaging发送重复通知?

问题分析与解决建议

你遇到的问题是:使用FCM给安卓PWA发送通知时,明明只触发了一次发送(日志和控制台推广活动都验证了发送次数),却收到两条格式不同的通知。结合场景和代码,核心原因大概率和PWA的通知接收逻辑重复或设备令牌重复有关,以下是具体排查和解决步骤:

1. 检查设备令牌是否重复

  • 确认数据库中用户的deviceToken是否唯一:如果PWA每次刷新都生成新令牌,但旧令牌未被标记失效,FCM会同时向新旧令牌推送,导致两条通知。
  • 手动测试:复制用户的单个deviceToken,在Firebase控制台发送单条通知,若仍收到两条,说明该令牌对应设备存在多个有效接收实例(比如service worker重复注册)。

2. 排查Service Worker的通知处理逻辑

FCM发送notification类型的消息时,安卓系统会自动展示一条通知;如果你的Service Worker中额外监听了push事件并手动调用showNotification,就会触发重复通知。
比如以下错误写法会导致重复:

self.addEventListener('push', (event) => {
  const payload = event.data?.json();
  // 这里手动展示通知,和FCM自动展示的重复
  self.registration.showNotification(payload.notification.title, payload.notification);
});

解决办法:

  • 若依赖FCM自动展示通知,直接删除Service Worker中push事件里的showNotification代码;
  • 若需要自定义通知样式,将payload改为data类型,完全由Service Worker处理通知展示:
    // 修改发送的payload
    const payload = {
      data: {
        title: "Erinnerung Tabletteneinnahme",
        body: "test",
        image: "你的图片URL",
        icon: "你的图标URL"
      }
    };
    
    然后在Service Worker中处理:
    self.addEventListener('push', (event) => {
      const data = event.data?.json();
      event.waitUntil(
        self.registration.showNotification(data.title, {
          body: data.body,
          icon: data.icon,
          image: data.image
        })
      );
    });
    

3. 优化发送代码(非直接原因,但避免潜在问题)

你的代码中admin.messaging().sendToDevice是异步操作,建议添加await确保发送逻辑完成,同时捕获错误:

try {
  await admin.messaging().sendToDevice(devicetoken, payload);
  console.log(`通知已发送给用户 ${userId}`);
} catch (error) {
  console.error(`发送通知失败:${error}`);
}

4. 检查PWA Manifest配置

确认manifest.json中的gcm_sender_id是否正确设置为103953800507(FCM固定的sender ID),错误的配置可能导致通知处理异常。

内容的提问来源于stack exchange,提问作者Jari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:07:38