Flutter聊天应用Android端FCM通知失效问题求助
Flutter Android端FCM通知不生效问题排查求助
我正在开发一款Flutter聊天应用,需要实现用户收到新消息时的通知功能。该功能在iOS设备上运行正常,但Android设备完全无法生效,请求帮助。
具体问题
- 请求通知权限时,Android设备未弹出权限请求弹窗
- 已添加
FirebaseMessaging.onMessage监听,但依然收不到通知 - FCM Token获取功能正常,数据库中能看到Android设备的Token,且云函数已通过该Token发送了通知
已实现的代码
权限请求与消息监听代码
import 'package:firebase_messaging/firebase_messaging.dart'; class PermissionService { Future<void> notification() async { await FirebaseMessaging.instance.requestPermission( alert: true, announcement: false, badge: true, carPlay: false, criticalAlert: false, provisional: false, sound: true, ); FirebaseMessaging.onMessage.listen((event) { print("A new message event was published"); }); FirebaseMessaging.onMessageOpenedApp.listen((event) { print("A new OpenedAppMessage event was published"); }); } }
FCM Token获取代码
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; class FCMService { final FirebaseAuth _firebaseAuth = FirebaseAuth.instance; Future<void> createFcmToken() async { final User? user = _firebaseAuth.currentUser; final fcmToken = await FirebaseMessaging.instance.getToken(); if (user != null) { await FirebaseFirestore.instance .collection("fcm_token") .doc(user.uid) .set({ "fcm_token": fcmToken, "user_id": user.uid, }); } } }
排查方向及解决方案
Android 13+权限补充配置
- Android 13及以上版本需单独申请
POST_NOTIFICATIONS权限,Firebase Messaging的requestPermission()默认不包含该权限:- 在
AndroidManifest.xml中添加权限声明:<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> - 使用
permission_handler包主动请求权限:import 'package:permission_handler/permission_handler.dart'; Future<void> requestAndroidNotificationPermission() async { if (await Permission.notification.isDenied) { await Permission.notification.request(); } }
- 在
- Android 13及以上版本需单独申请
前台通知渠道创建
- Android前台消息必须绑定通知渠道才能显示,应用初始化时添加以下代码:
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; final FlutterLocalNotificationsPlugin _notificationsPlugin = FlutterLocalNotificationsPlugin(); Future<void> initializeLocalNotifications() async { const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/ic_launcher'); const InitializationSettings initializationSettings = InitializationSettings(android: initializationSettingsAndroid); await _notificationsPlugin.initialize(initializationSettings); // 创建高优先级通知渠道 const AndroidNotificationChannel channel = AndroidNotificationChannel( 'chat_notification_channel', '聊天通知', description: '接收新消息通知', importance: Importance.max, ); await _notificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()?.createNotificationChannel(channel); } - 修改
onMessage监听,手动触发本地通知:FirebaseMessaging.onMessage.listen((RemoteMessage message) { RemoteNotification? notification = message.notification; AndroidNotification? android = message.notification?.android; if (notification != null && android != null) { _notificationsPlugin.show( notification.hashCode, notification.title, notification.body, NotificationDetails( android: AndroidNotificationDetails( 'chat_notification_channel', '聊天通知', channelDescription: '接收新消息通知', icon: android.smallIcon, ), ), ); } });
- Android前台消息必须绑定通知渠道才能显示,应用初始化时添加以下代码:
后台消息处理配置
- 创建
FirebaseMessagingService子类处理后台消息(需在AndroidManifest.xml注册):class MyFirebaseMessagingService : FirebaseMessagingService() { override fun onMessageReceived(remoteMessage: RemoteMessage) { super.onMessageReceived(remoteMessage) // 此处可调用本地通知展示后台消息 } }
- 创建
云函数消息格式校验
- 确保云函数发送的消息包含
notification字段(前台展示)和android.priority: 'high'配置,示例:const message = { token: fcmToken, notification: { title: '新消息', body: '您收到一条新消息' }, data: { chatId: 'xxx' }, android: { priority: 'high' } };
- 确保云函数发送的消息包含
内容的提问来源于stack exchange,提问作者Juliettead
相关产品推荐
相关产品推荐

