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

Angular 14集成Firebase Cloud Messaging无法接收消息问题求助

Angular 14集成Firebase Cloud Messaging V1 API无法接收消息问题

我在Angular 14项目中集成了Firebase Cloud Messaging(FCM)V1 API,已成功获取设备令牌,且能通过本地Node.js服务器发送消息,但Angular应用始终无法接收消息。我按照AngularFire官方文档配置,相关代码与配置如下:


app.module.ts

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';

import { AngularFireModule } from '@angular/fire/compat';
import { AngularFireMessagingModule } from '@angular/fire/compat/messaging';

import { environment } from 'src/environments/environment';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    AngularFireModule.initializeApp(environment.firebase),
    AngularFireMessagingModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

app.component.ts

import { Component, OnInit } from '@angular/core';
import { AngularFireMessaging } from '@angular/fire/compat/messaging';


@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  title = 'notif-boilerplate-web';

  constructor(private afMessaging: AngularFireMessaging) { }


  ngOnInit() {
    this.requestPermission()
    this.listen()
  }

  requestPermission() {
    this.afMessaging.requestToken.subscribe({
      next: token => {
        console.log(token)
      }
    })
  }

  listen() {
    this.afMessaging.messages
      .subscribe((message) => { console.log(message); });
  }
}

index.html

<!doctype html>
<html lang="en">
<head>
  <link rel="manifest" href="./manifest.json">
  <meta charset="utf-8">
  <title>NotifBoilerplateWeb</title>
  <base href="/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
  <app-root></app-root>
</body>
</html>

firebase-messaging-sw.js

importScripts("https://www.gstatic.com/firebasejs/9.15.0/firebase-app-compat.js");
importScripts("https://www.gstatic.com/firebasejs/9.15.0/firebase-messaging-compat.js");

firebase.initializeApp({
    apiKey: "***************",
    authDomain: "*********.firebaseapp.com",
    projectId: "**************",
    storageBucket: "***********.appspot.com",
    messagingSenderId: "*************",
    appId: "*************",
    measurementId: "*****************",
    vapidKey: "******************-vzYU5mGBnfis-ADYy7k9V88yTg"
})

const messaging = firebase.messaging();

console.log(messaging)

messaging.onMessage((payload) => {
    console.log('Message received. ', payload);
    // ...
});

manifest.json

{
    "gcm_sender_id": "10****************"
}

angular.json(assets配置片段)

"assets": [
  "src/favicon.ico",
  "src/assets",
  "src/firebase-messaging-sw.js",
  "src/manifest.json"
]

排查与修复方案

1. 修正Service Worker核心配置

FCM要求manifest.json中的gcm_sender_id必须是固定值"103953800507",不能替换为自定义ID,修改后:

{
    "gcm_sender_id": "103953800507"
}

同时补充Service Worker的后台消息处理逻辑,确保后台消息能触发通知:

importScripts("https://www.gstatic.com/firebasejs/9.15.0/firebase-app-compat.js");
importScripts("https://www.gstatic.com/firebasejs/9.15.0/firebase-messaging-compat.js");

firebase.initializeApp({
    // 你的Firebase配置信息
});

const messaging = firebase.messaging();

// 前台消息处理:同步通知到Angular应用
messaging.onMessage((payload) => {
    console.log('前台消息(Service Worker):', payload);
    self.clients.matchAll({ type: 'window' }).then(clients => {
        clients.forEach(client => client.postMessage(payload));
    });
});

// 后台消息处理:显示系统通知
messaging.onBackgroundMessage((payload) => {
    console.log('后台消息:', payload);
    const notificationOptions = {
        body: payload.notification.body,
        title: payload.notification.title,
        icon: payload.notification.icon
    };
    self.registration.showNotification(payload.notification.title, notificationOptions);
});

2. 完善Angular应用的消息监听逻辑

补充Service Worker注册与权限校验,同时处理前台消息的弹窗展示:

import { Component, OnInit } from '@angular/core';
import { AngularFireMessaging } from '@angular/fire/compat/messaging';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  title = 'notif-boilerplate-web';

  constructor(private afMessaging: AngularFireMessaging) { }

  ngOnInit() {
    this.registerServiceWorker();
    this.requestPermission();
    this.listenForMessages();
  }

  // 手动注册Service Worker
  registerServiceWorker() {
    if ('serviceWorker' in navigator) {
      navigator.serviceWorker.register('/firebase-messaging-sw.js')
        .then(reg => console.log('Service Worker注册成功:', reg))
        .catch(err => console.error('Service Worker注册失败:', err));
    }
  }

  requestPermission() {
    this.afMessaging.requestToken.subscribe({
      next: token => console.log('设备令牌:', token),
      error: err => console.error('获取令牌失败:', err)
    });
  }

  listenForMessages() {
    // 监听前台消息
    this.afMessaging.messages.subscribe((message: any) => {
      console.log('前台收到消息:', message);
      // 手动触发浏览器通知
      if (Notification.permission === 'granted') {
        new Notification(message.notification.title, {
          body: message.notification.body,
          icon: message.notification.icon
        });
      }
    });

    // 监听Service Worker转发的消息
    navigator.serviceWorker.addEventListener('message', (event) => {
      console.log('收到Service Worker消息:', event.data);
    });
  }
}

3. 验证FCM V1 API的消息格式

发送消息时必须使用V1规范的Payload,确保包含notification字段(用于触发系统通知)和token字段(目标设备令牌),示例:

{
  "message": {
    "token": "你的设备令牌",
    "notification": {
      "title": "测试通知",
      "body": "这是一条FCM测试消息"
    },
    "data": {
      "customKey": "自定义数据"
    }
  }
}

4. 环境与权限校验

  • 必须在HTTPS环境下测试(localhost可例外),生产环境强制HTTPS
  • 确认浏览器已授予当前站点的通知权限
  • 清除浏览器缓存与旧Service Worker,重新加载应用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:35:32