Flutter Web集成FCM本地正常,部署Firebase Hosting报错求助
以下是针对你遇到的本地正常、部署后出现MissingPluginException(No implementation found for method Messaging#getToken)问题的排查和修复步骤:
调整Service Worker注册顺序
你当前的代码中先注册FCM的Service Worker,再初始化Flutter,这可能导致Flutter的Service Worker覆盖或干扰FCM的插件实现。修改index.html中的脚本,将FCM的Service Worker注册放在Flutter初始化完成之后:<script> window.addEventListener("load", function (ev) { _flutter.loader .loadEntrypoint({ serviceWorker: { serviceWorkerVersion: serviceWorkerVersion, }, }) .then(function (engineInitializer) { return engineInitializer.initializeEngine(); }) .then(function (appRunner) { // 先完成Flutter引擎初始化,再注册FCM的Service Worker if ("serviceWorker" in navigator) { navigator.serviceWorker.register("/firebase-messaging-sw.js"); } return appRunner.runApp(); }); }); </script>验证firebase-messaging-sw.js的位置与内容
确保该文件放在web目录的根路径下,构建后会被自动复制到build/web文件夹中。文件需要包含正确的Firebase初始化代码,示例如下(替换为你的项目配置):importScripts('https://www.gstatic.com/firebasejs/9.22.0/firebase-app.js'); importScripts('https://www.gstatic.com/firebasejs/9.22.0/firebase-messaging.js'); firebase.initializeApp({ apiKey: "你的API_KEY", authDomain: "你的AUTH_DOMAIN", projectId: "你的PROJECT_ID", storageBucket: "你的STORAGE_BUCKET", messagingSenderId: "你的SENDER_ID", appId: "你的APP_ID" }); const messaging = firebase.messaging();注意JS版本要和你的dart包版本兼容,避免版本不匹配导致的插件实现缺失。
清理Firebase Hosting缓存
部署后旧的静态资源可能被缓存,导致新的FCM插件代码未加载。执行部署命令时添加缓存清理标记:firebase deploy --only hosting -m "清除缓存,更新FCM资源"也可以直接在Firebase控制台的Hosting设置中手动触发缓存清理。
补充Firebase Web初始化配置
在index.html的head标签中添加Firebase Web端的初始化脚本,确保在Flutter加载前完成Firebase初始化:<script type="module"> import { initializeApp } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-app.js"; const firebaseConfig = { apiKey: "你的API_KEY", authDomain: "你的AUTH_DOMAIN", projectId: "你的PROJECT_ID", storageBucket: "你的STORAGE_BUCKET", messagingSenderId: "你的SENDER_ID", appId: "你的APP_ID" }; const app = initializeApp(firebaseConfig); </script>重新构建项目
执行以下命令清理旧构建文件,重新获取依赖并构建生产版本:flutter clean flutter pub get flutter build web --release同时确认pubspec.yaml中已添加
firebase_core依赖(FCM必须依赖它):firebase_core: ^2.15.0 firebase_messaging: ^14.2.1
内容的提问来源于stack exchange,提问作者David Somekh

