You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Vue.js中正确配置Firebase Cloud Messaging(FCM)?

Vue.js 配置 Firebase Cloud Messaging (FCM) 新手友好指南

作为过来人,完全懂你看官方文档一脸懵的感受——术语多、不说代码放哪儿,新手真的难顶。下面我把每一步拆得明明白白,连文件位置、代码作用都给你讲清楚,跟着做就行!

第一步:先搞定Firebase端的准备工作

  1. 打开Firebase控制台,创建一个新项目(如果已有项目直接用)。
  2. 点击「添加应用」,选择Web平台(就是那个</>图标),随便起个应用昵称,不用勾选「设置Firebase托管」,直接点「注册应用」。
  3. 接下来会看到一段firebaseConfig代码,复制下来存好,后面要用到。
  4. 然后去项目设置 → 云消息传递 → Web配置,点击「生成密钥对」,拿到你的vapidKey,也复制存好。

第二步:给Vue项目装依赖

打开你的Vue项目终端,安装Firebase SDK:

npm install firebase
# 或者用yarn
yarn add firebase

第三步:创建Firebase配置文件

在Vue项目的src文件夹下,新建一个firebase文件夹,里面创建firebase.js文件(路径:src/firebase/firebase.js),把下面的代码贴进去,替换成你刚才复制的firebaseConfigvapidKey

import { initializeApp } from "firebase/app";
import { getMessaging, getToken, onMessage } from "firebase/messaging";

// 替换成你的Firebase配置
const firebaseConfig = {
  apiKey: "你的apiKey",
  authDomain: "你的authDomain",
  projectId: "你的projectId",
  storageBucket: "你的storageBucket",
  messagingSenderId: "你的messagingSenderId",
  appId: "你的appId"
};

// 初始化Firebase应用
const app = initializeApp(firebaseConfig);

// 获取FCM实例
const messaging = getMessaging(app);

// 注册Service Worker
import { useServiceWorker } from "firebase/messaging";
useServiceWorker(messaging, navigator.serviceWorker.register('/firebase-messaging-sw.js'));

// 导出messaging和相关方法,方便组件调用
export { messaging, getToken, onMessage };

第四步:配置Service Worker(关键!很多新手卡在这里)

FCM需要Service Worker来处理后台消息,所以我们要在public文件夹下创建firebase-messaging-sw.js(路径:public/firebase-messaging-sw.js)——因为Service Worker必须放在项目的根目录下,Vue的public文件夹就是编译后的根目录。

把下面的代码贴进去,同样替换成你的firebaseConfig

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

// 这里用compat版本是为了兼容Service Worker的环境
firebase.initializeApp({
  apiKey: "你的apiKey",
  authDomain: "你的authDomain",
  projectId: "你的projectId",
  storageBucket: "你的storageBucket",
  messagingSenderId: "你的messagingSenderId",
  appId: "你的appId"
});

const messaging = firebase.messaging();

// 处理后台消息(用户不在当前页面时触发)
messaging.onBackgroundMessage(function(payload) {
  console.log('收到后台消息:', payload);
  const notificationTitle = payload.notification.title;
  const notificationOptions = {
    body: payload.notification.body,
    icon: '/firebase-logo.png' // 可以换成你自己的通知图标,放在public文件夹里
  };

  self.registration.showNotification(notificationTitle, notificationOptions);
});

第五步:在Vue组件中实现通知功能

比如我们在App.vue里集成,这样打开页面就能请求通知权限、获取FCM Token:

<template>
  <div id="app">
    <h1>FCM测试页面</h1>
    <p v-if="token">你的FCM Token: {{ token }}</p>
    <p v-else>正在获取Token...</p>
  </div>
</template>

<script>
import { messaging, getToken, onMessage } from './firebase/firebase.js';

export default {
  data() {
    return {
      token: ''
    }
  },
  async mounted() {
    // 请求用户通知权限
    const permission = await Notification.requestPermission();
    if (permission === 'granted') {
      // 获取FCM Token
      try {
        const currentToken = await getToken(messaging, {
          vapidKey: '你的vapidKey' // 替换成你之前生成的vapidKey
        });
        if (currentToken) {
          this.token = currentToken;
          console.log('FCM Token:', currentToken);
          // 这里可以把Token发给你的后端,用来给用户推送消息
        } else {
          console.log('没有获取到Token,请检查配置');
        }
      } catch (error) {
        console.log('获取Token失败:', error);
      }

      // 监听前台消息(用户在当前页面时触发)
      onMessage(messaging, (payload) => {
        console.log('收到前台消息:', payload);
        alert(`收到通知:${payload.notification.title}\n${payload.notification.body}`);
      });
    } else {
      console.log('用户拒绝了通知权限');
    }
  }
}
</script>

第六步:测试一下!

  1. 启动你的Vue项目:npm run serve,打开http://localhost:8080,会弹出请求通知权限的弹窗,点击允许。
  2. 控制台会打印出你的FCM Token,复制这个Token。
  3. 回到Firebase控制台 → 云消息传递 → 发送测试消息,粘贴Token进去,设置标题和内容,点击「测试」。
  4. 如果当前页面打开着,会弹出alert;如果页面最小化/关闭,会看到系统通知,就说明配置成功了!

一些新手容易踩的坑

  • Service Worker路径问题:一定要放在public文件夹下,不能放在src里,否则编译后找不到。
  • HTTPS要求:FCM要求生产环境必须用HTTPS,但本地开发用localhost是可以的,不用纠结。
  • vapidKey别写错:这个密钥是Web平台专属的,复制的时候别漏字符。

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

火山引擎 最新活动