Firebase Cloud Messaging推送令牌遇UNREGISTERED(HTTP 404)问题求助
解决FCM推送返回UNREGISTERED的问题
1. 修复Service Worker语法错误
你的firebase-messaging-sw.js存在未闭合的函数括号,会导致Service Worker加载失败,FCM无法建立有效推送通道——即使拿到令牌,也会被标记为未注册。修复后的代码:
importScripts( 'https://www.gstatic.com/firebasejs/9.0.0/firebase-app-compat.js', ); importScripts( 'https://www.gstatic.com/firebasejs/9.0.0/firebase-messaging-compat.js', ); firebase.initializeApp(FIREBASE_CONFIG); const messaging = firebase.messaging(); messaging.onBackgroundMessage(payload => { const notificationTitle = payload.data.title; const notificationOptions = { body: payload.data.body, icon: payload.data.icon, badge: payload.data.badge, click_action: payload.data.click_action, }; self.registration.showNotification( notificationTitle, notificationOptions, ); }); // 补全闭合括号
2. 修正推送请求的JSON格式错误
你的CURL请求体中,notification对象的title字段后缺少逗号,会导致请求格式无效,可能被FCM错误解析为令牌问题。修正后的请求体:
{ "registration_ids": [ "<FIREBASE_USER_TOKEN>" ], "notification": { "title": "<TITLE_OF_NOTIFICATION>", "body": "<BODY_MESSAGE_OF_NOTIFICATION>" } }
3. 补全前端Firebase初始化流程
你获取令牌的代码缺少Firebase App初始化步骤,messaging实例必须来自已初始化的App。补充完整代码:
// 先初始化Firebase App firebase.initializeApp({ // 填入你的项目配置:apiKey, authDomain, projectId, messagingSenderId等 }); const messaging = firebase.messaging(); const permission = await Notification.requestPermission(); if (permission === 'granted') { const token = await getToken(messaging, { vapidKey: process.env.VAPID_KEY, }); // 建议监听令牌刷新事件,及时更新后端存储的令牌 messaging.onTokenRefresh(() => { getToken(messaging, { vapidKey: process.env.VAPID_KEY }) .then(refreshedToken => { // 同步更新后端的令牌记录 }); }); }
4. 验证密钥正确性
- VAPID Key:必须是Firebase控制台「项目设置->云消息传递->Web推送证书」中的公钥,不能用私钥,且前后端使用同一公钥。
- Server Key:使用Firebase控制台「项目设置->云消息传递->Cloud Messaging API (Legacy)」下的服务器密钥,旧端点
fcm/send不支持新的v1 API密钥。
5. 检查Service Worker与推送订阅状态
- 打开浏览器DevTools的「Application->Service Workers」,确认
firebase-messaging-sw.js已激活且无报错。 - 查看「Application->Push Subscriptions」,确认存在有效订阅,且端点URL包含
fcm.googleapis.com。 - 若订阅无效,可手动删除后重新获取令牌:
await deleteToken(messaging); const newToken = await getToken(messaging, { vapidKey: process.env.VAPID_KEY });
6. 确认PWA运行环境合规
- 必须运行在HTTPS协议下(localhost开发环境除外)。
- Firebase配置中的
messagingSenderId需与项目一致,且域名已添加到Firebase控制台的「授权域」列表。
内容的提问来源于stack exchange,提问作者Parth Andhariya
相关产品推荐
相关产品推荐

