Flutter集成FCM后安卓模拟器推送通知不显示问题求助
我正在尝试为Flutter应用配置Firebase Cloud Messaging(FCM)推送通知,目前先从手动发送通知负载、让安卓应用作为后台通知处理开始,但模拟器中完全没显示通知。此外,打开模拟器里的应用时,没有收到通知权限请求,Firebase控制台显示通知发送数为0。我的应用同时使用Cloud Firestore和Google服务(因此请求了位置权限)。
以下是我的main.dart代码:
import 'package:flutter/material.dart'; import 'package:redue/Screens/Welcome%20Screen/WelcomeScreen.dart'; import 'pages/menu.dart'; import 'package:firebase_core/firebase_core.dart'; import 'firebase_options.dart'; import 'pages/settings.dart'; import 'package:location/location.dart'; import 'pages/settings.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async { await Firebase.initializeApp(); print("Handling a background message: ${message.messageId}"); } final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance; Future main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); Location location = new Location(); bool _serviceEnabled; PermissionStatus _permissionGranted; _serviceEnabled = await location.serviceEnabled(); if (!_serviceEnabled) { _serviceEnabled = await location.requestService(); if (!_serviceEnabled) { return null; } } _permissionGranted = await location.hasPermission(); if (_permissionGranted == PermissionStatus.denied) { _permissionGranted = await location.requestPermission(); if (_permissionGranted != PermissionStatus.granted) { return null; } } _firebaseMessaging.requestPermission( alert: true, announcement: false, badge: true, carPlay: false, criticalAlert: false, provisional: false, sound: true, ); FirebaseMessaging messaging = FirebaseMessaging.instance; FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); FirebaseMessaging.onMessage.listen((RemoteMessage message) { print('Got a message whilst in the foreground!'); print('Message data: ${message.data}'); if (message.notification != null) { print('Message also contained a notification: ${message.notification}'); } }); runApp(const MyApp()); } class MyApp extends StatefulWidget { const MyApp({super.key}); @override State<MyApp> createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { // This widget is the root of your application. @override void initState() { super.initState(); currentTheme.addListener(() { setState(() {}); }); } @override Widget build(BuildContext context) { return MaterialApp( title: "ReDue", debugShowCheckedModeBanner: false, theme: ThemeData.light(), darkTheme: ThemeData.dark(), home: WelcomeScreen(), ); } }
排查与解决建议
修复权限请求逻辑:
- 安卓13及以上版本需要单独请求
POST_NOTIFICATIONS权限,调用requestPermission()后要处理返回的权限状态,确保用户授权。 - 当前位置权限逻辑存在问题:如果用户拒绝位置权限,
main函数直接返回null,导致后续FCM的权限请求、消息监听等代码完全未执行。调整位置权限处理逻辑,不要直接退出,而是提示用户后继续执行FCM初始化。
- 安卓13及以上版本需要单独请求
修正后台消息处理函数:
后台消息处理函数_firebaseMessagingBackgroundHandler中重复调用Firebase.initializeApp()是不必要的,main函数已完成初始化,可修改为:Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async { print("Handling a background message: ${message.messageId}"); // 如需处理data消息,可在此手动构建通知显示 }确保模拟器环境正常:
选择带Google APIs的安卓系统镜像(模拟器需支持Google Play服务),并确保模拟器已联网、登录Google账号,否则FCM无法正常推送。验证FCM令牌获取:
添加代码获取并打印FCM令牌,确认应用成功注册到FCM:// 在main函数的FCM初始化后添加 String? fcmToken = await _firebaseMessaging.getToken(); print('FCM令牌: $fcmToken');如果令牌为空,检查
google-services.json是否正确放置在android/app目录下,以及安卓项目build.gradle是否正确引入FCM依赖。检查通知负载格式:
手动发送通知时必须包含notification字段,才能让系统自动显示后台通知,示例负载结构:{ "notification": { "title": "测试通知", "body": "这是一条后台测试通知" }, "to": "你的FCM令牌" }若仅发送
data字段,需在后台消息处理函数中手动构建通知并显示。确认Firebase项目配置:
确保Firebase项目中已正确添加安卓应用,包名与项目包名完全一致,且google-services.json是最新下载的版本。
内容的提问来源于stack exchange,提问作者ReDue

