Flutter集成Firebase推送通知无显示问题求助
Flutter Firebase推送通知不显示问题解决
问题分析
你已经获取到FCM Token,且日志显示broadcast received for message(消息已被接收),但通知未弹出,核心原因是:
- 未配置前台通知展示逻辑(默认FCM不会在前台自动弹出通知)
- Android 8+未创建通知通道(系统强制要求)
- 缺少后台/终止状态的通知处理配置
日志中的analytics library is missing警告不影响通知功能,仅为Firebase事件日志缺失,可选择消除。
具体解决步骤
1. 添加必要依赖
在pubspec.yaml中补充依赖:
dependencies: firebase_core: ^latest_version firebase_messaging: ^latest_version flutter_local_notifications: ^latest_version # 用于前台展示通知 # 可选:添加消除analytics警告 firebase_analytics: ^latest_version
(将latest_version替换为pub.dev上的最新版本号)
2. 完善FirebaseApi类
修改firebase_api.dart,添加通知展示、通道创建和消息监听逻辑:
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; class FirebaseApi { final _firebaseMessaging = FirebaseMessaging.instance; final _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); Future<void> initNotifications() async { // 请求用户通知权限 await _firebaseMessaging.requestPermission( alert: true, badge: true, sound: true, ); // 获取并打印FCM Token final fCMToken = await _firebaseMessaging.getToken(); print('Token: $fCMToken'); // 初始化本地通知插件及Android通道 await _initLocalNotifications(); // 监听前台收到的消息,弹出通知 FirebaseMessaging.onMessage.listen((RemoteMessage message) { final notification = message.notification; final android = message.notification?.android; if (notification != null && android != null) { _flutterLocalNotificationsPlugin.show( notification.hashCode, notification.title, notification.body, NotificationDetails( android: AndroidNotificationDetails( 'push_channel', // 自定义通道ID '推送通知', // 自定义通道名称 channelDescription: '接收Firebase推送通知', // 自定义通道描述 importance: Importance.max, priority: Priority.high, icon: '@mipmap/ic_launcher', // 关联应用图标 ), ), ); } }); // 处理后台/终止状态下点击通知的逻辑 FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { print('通知被点击,数据:${message.data}'); // 可添加页面跳转等业务逻辑 }); } // 初始化本地通知及Android通道 Future<void> _initLocalNotifications() async { // Android初始化配置 const androidInit = AndroidInitializationSettings('@mipmap/ic_launcher'); // iOS初始化配置(可选) const iosInit = DarwinInitializationSettings(); await _flutterLocalNotificationsPlugin.initialize( const InitializationSettings(android: androidInit, iOS: iosInit), ); // 创建Android通知通道(Android 8+必须) const channel = AndroidNotificationChannel( 'push_channel', '高优先级通知', description: '用于接收Firebase推送的重要通知', importance: Importance.max, ); await _flutterLocalNotificationsPlugin .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>() ?.createNotificationChannel(channel); } // 后台消息处理器(应用终止时触发) static Future<void> backgroundMessageHandler(RemoteMessage message) async { print('后台收到消息:${message.messageId}'); } }
3. 配置后台消息处理
修改main.dart,注册后台消息处理器:
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; // 可选:引入analytics // import 'package:firebase_analytics/firebase_analytics.dart'; import 'api/firebase_api.dart'; import 'firebase_options.dart'; import 'package:flutter/material.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); // 注册后台消息处理器 FirebaseMessaging.onBackgroundMessage(FirebaseApi.backgroundMessageHandler); // 可选:初始化analytics消除警告 // await FirebaseAnalytics.instance.setAnalyticsCollectionEnabled(true); await FirebaseApi().initNotifications(); runApp(const TesMagenta()); } // 示例应用组件 class TesMagenta extends StatelessWidget { const TesMagenta({super.key}); @override Widget build(BuildContext context) { return const MaterialApp(home: Scaffold(body: Center(child: Text('测试推送')))); } }
4. 检查平台配置
Android端
确保android/app/src/main/AndroidManifest.xml包含以下配置:
<!-- 通知权限 --> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <!-- Firebase Messaging服务 --> <service android:name="com.google.firebase.messaging.FirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service>
iOS端
在ios/Runner/Info.plist中添加:
<key>FirebaseAppDelegateProxyEnabled</key> <false/> <key>UIBackgroundModes</key> <array> <string>remote-notification</string> </array>
并在Xcode中开启Push Notifications权限(Signing & Capabilities -> 添加该功能)。
测试验证
- 重新运行应用,确认Token正常打印
- 在Firebase控制台发送测试通知时,确保填写正确的Token,且标题、内容不为空
- 分别测试应用在前台、后台、终止状态下的通知接收情况
内容的提问来源于stack exchange,提问作者Asa Marsal
相关产品推荐
相关产品推荐

