Android端Flutter集成FCM获取Token失败报错求助
你在纯Android平台的Flutter应用中集成Firebase Cloud Messaging(FCM)获取Token时,遇到以下错误:
FirebaseError: Messaging: We are unable to register the default service worker. Failed to register a ServiceWorker for scope ('http://localhost:34839/firebase-cloud-messaging-push-scope') with script ('http://localhost:34839/firebase-messaging-sw.js'): The script has an unsupported MIME type ('text/html'). (messaging/failed-service-worker-registration)
问题原因
这个错误的核心是FCM SDK误将Android环境判定为Web环境,触发了仅适用于Web平台的Service Worker注册逻辑。Service Worker是Web应用的特性,纯Android应用完全不需要这一组件,出现该问题通常是依赖版本bug、冗余Web配置或环境判断异常导致的。
解决步骤
更新firebase_messaging依赖
旧版本的firebase_messaging可能存在平台识别逻辑缺陷,先确保依赖为最新稳定版。修改pubspec.yaml:dependencies: firebase_messaging: ^latest_version # 替换为实际最新版本号执行命令更新依赖:
flutter pub get删除Web相关冗余文件
若之前为Web平台配置过FCM,项目中可能存在firebase-messaging-sw.js等Web专属文件,这些文件会干扰Android构建环境,直接删除项目根目录或web文件夹下的此类文件。显式限定Android平台执行FCM逻辑
在初始化代码中添加平台判断,确保FCM相关操作仅在Android环境下执行,避免SDK误判:import 'dart:io' show Platform; import 'package:firebase_messaging/firebase_messaging.dart'; class FirebaseApi{ final _firebaseMessaging = FirebaseMessaging.instance; Future<void> initNotifications() async{ if (Platform.isAndroid) { try{ await _firebaseMessaging.requestPermission(); final FCMToken = await _firebaseMessaging.getToken(); print('Token: $FCMToken'); } catch (e){ print('error: $e'); } } } }清理缓存并重新构建
执行以下命令清理项目缓存,避免旧配置残留:flutter clean flutter pub get flutter run验证Firebase配置正确性
确认FirebaseOptions中的参数完全匹配Firebase控制台中Android应用的配置,不要混用Web应用的appId或其他参数。
测试验证
完成以上操作后重新运行应用,FCM应该能正常请求权限并返回Token,不会再触发Service Worker相关的错误。
内容的提问来源于stack exchange,提问作者hadil affes

