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

Flutter中App关闭时无法接收FCM消息的问题求助

Flutter FCM + 本地通知在Android 12上的问题修复

问题1:应用终止后FCM消息被取消(Logcat显示CANCELLED)

核心原因

  • Android 12对后台组件启动限制更严格,你的AndroidManifest.xml缺少FCM必需的服务与广播接收器配置
  • 后台消息处理函数未初始化Firebase,导致无法在应用进程终止时处理消息

修复步骤

  1. 补充AndroidManifest配置
    在<application>标签内添加以下FCM相关配置:

    <!-- 新增FCM所需权限 -->
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
    
    <!-- FCM消息处理服务 -->
    <service
        android:name="com.google.firebase.messaging.FirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>
    
    <!-- C2DM广播接收器,处理高优先级消息 -->
    <receiver
        android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
            <action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
            <category android:name="${applicationId}"/>
        </intent-filter>
    </receiver>
    
  2. 修正后台消息处理函数
    后台消息处理函数必须先初始化Firebase,才能正常处理并展示通知:

    Future<void> _onBackgroundMessageHandler(RemoteMessage message) async {
      // 必须初始化Firebase
      await Firebase.initializeApp();
      FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
    
      // 初始化本地通知配置
      const AndroidInitializationSettings androidInitializationSettings = AndroidInitializationSettings('launch_background');
      const InitializationSettings initializationSettings = InitializationSettings(android: androidInitializationSettings);
      await flutterLocalNotificationsPlugin.initialize(initializationSettings);
    
      // 配置高优先级通知参数
      var androidDetails = const AndroidNotificationDetails(
        'com.test.app.notification_channel',
        'Test Notification Channel',
        channelDescription: 'Notification Channel for Test App for Android',
        priority: Priority.high,
        importance: Importance.max,
      );
      var generalNotificationDetails = NotificationDetails(android: androidDetails);
    
      // 展示后台通知
      if (message.notification != null) {
        await flutterLocalNotificationsPlugin.show(
          message.notification.hashCode,
          message.notification?.title,
          message.notification?.body,
          generalNotificationDetails,
          payload: jsonEncode(message.data),
        );
      }
      debugPrint('Background FCM NOTIFICATION[#${message.messageId}] - Data: ${message.data} Title: ${message.notification?.title} Body: ${message.notification?.body}');
    }
    

问题2:前台通知仅在托盘显示,不弹窗

核心原因

AndroidNotificationDetails未设置importance: Importance.max,Android 12要求明确指定高重要性才能触发弹窗提示。

修复步骤

修改_setupPushNotification中的androidDetails配置:

var androidDetails = const AndroidNotificationDetails(
  'com.test.app.notification_channel',
  'Test Notification Channel',
  channelDescription: 'Notification Channel for Test App for Android',
  priority: Priority.high,
  importance: Importance.max, // 新增此行,确保通知弹窗
  enableVibration: true, // 可选:增强通知提示
  enableLights: true,
);

同时检查Android系统的应用通知设置,确保对应通知渠道处于启用状态。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:27:20