You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,
      });
    }
  }
}

排查方向及解决方案

  1. 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();
          }
        }
        
  2. 前台通知渠道创建

    • 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,
              ),
            ),
          );
        }
      });
      
  3. 后台消息处理配置

    • 创建FirebaseMessagingService子类处理后台消息(需在AndroidManifest.xml注册):
      class MyFirebaseMessagingService : FirebaseMessagingService() {
          override fun onMessageReceived(remoteMessage: RemoteMessage) {
              super.onMessageReceived(remoteMessage)
              // 此处可调用本地通知展示后台消息
          }
      }
      
  4. 云函数消息格式校验

    • 确保云函数发送的消息包含notification字段(前台展示)和android.priority: 'high'配置,示例:
      const message = {
        token: fcmToken,
        notification: {
          title: '新消息',
          body: '您收到一条新消息'
        },
        data: {
          chatId: 'xxx'
        },
        android: {
          priority: 'high'
        }
      };
      

内容的提问来源于stack exchange,提问作者Juliettead

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:25:17