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

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与推送订阅状态

  1. 打开浏览器DevTools的「Application->Service Workers」,确认firebase-messaging-sw.js已激活且无报错。
  2. 查看「Application->Push Subscriptions」,确认存在有效订阅,且端点URL包含fcm.googleapis.com。
  3. 若订阅无效,可手动删除后重新获取令牌:
    await deleteToken(messaging);
    const newToken = await getToken(messaging, { vapidKey: process.env.VAPID_KEY });
    

6. 确认PWA运行环境合规

  • 必须运行在HTTPS协议下(localhost开发环境除外)。
  • Firebase配置中的messagingSenderId需与项目一致,且域名已添加到Firebase控制台的「授权域」列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:15:09