FCM + NodeJS 后台推送通知:Chrome后台收消息不弹通知代码排查
代码存在的核心问题
你当前的代码只适配了数据类型的推送消息,未兼容Firebase Cloud Messaging(FCM)的两种推送消息格式:
- 通知消息:推送字段存放在
payload.notification下,FCM默认会自动弹通知,但如果你手动监听了onBackgroundMessage,默认逻辑会被覆盖,需要自己从notification字段取值 - 数据消息:推送字段存放在
payload.data下,就是你当前代码的取值逻辑
如果后台推送时混用两种格式,就会出现拿到的title或body为空,触发showNotification时参数非法导致通知不弹出。
修复后的代码示例
messaging.onBackgroundMessage((payload) => { console.log("event content ==>", payload) console.log('[firebase-messaging-sw.js] Background Push Received ', payload); // 兼容两种推送格式,优先取通知消息字段,没有再取数据消息字段 const notificationPayload = payload.notification || payload.data || {}; const title = notificationPayload.title || "新通知"; const body = notificationPayload.body || "你收到了一条新消息"; const icon = notificationPayload.icon || '/gmp-icon.png'; const options = { body: body, icon: icon, // 建议加上data字段,方便后续点击通知跳转逻辑使用 data: payload.data || {} }; // 加异常捕获,避免字段异常导致执行中断 try { return self.registration.showNotification(title, options); } catch (error) { console.error("通知弹出失败:", error); } });
额外排查点
- 确认Chrome的站点通知权限已开启:访问
chrome://settings/content/notifications,检查你的站点不在禁止列表中 - 确认操作系统没有禁用Chrome的通知权限,也没有开启专注模式/免打扰模式
- 确认推送发送时没有设置
content_available为false或者其他静默推送参数 - 如果是HTTP站点,Chrome不支持后台推送,必须部署为HTTPS(localhost开发环境除外)
内容的提问来源于stack exchange,提问作者rdrgtec
相关产品推荐
相关产品推荐

