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

Flutter FCM应用终止状态无法弹出通知问题排查

问题分析与修复方案

针对应用终止状态无法接收FCM通知的问题,从你的代码中梳理出以下关键问题及修复方式:

1. 未处理应用终止状态下的初始消息

FirebaseMessaging.instance.getInitialMessage()会返回应用从终止状态被通知唤醒时的消息,但你仅调用方法未处理返回值。需监听该消息并触发通知展示:

修改initState中的代码:

@override
void initState() {
  super.initState();
  sub();
  // 处理应用终止状态下点击通知启动的场景
  FirebaseMessaging.instance.getInitialMessage().then((RemoteMessage? message) {
    if (message != null) {
      showFlutterNotification(message);
    }
  });

  FirebaseMessaging.onMessage.listen(showFlutterNotification);

  FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
    print('A new onMessageOpenedApp event was published!');
  });
}

2. 后台消息处理函数的异步时序问题

_firebaseMessagingBackgroundHandler中,初始化通知插件后直接调用showFlutterNotification可能存在时序问题,需确保渠道创建完成后再展示,同时添加错误捕获:

@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  try {
    await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
    await setupFlutterNotifications();
    // 确保通知渠道已初始化
    if (channel.id.isNotEmpty) {
      showFlutterNotification(message);
    }
    print('Handling a background message ${message.messageId}');
  } catch (e) {
    print('Background message handle error: $e');
  }
}

3. 通知渠道创建时机优化

首次安装后未启动过的应用,终止状态下收到消息时后台handler才创建渠道可能导致系统无法及时展示通知。建议在setupFlutterNotifications中强制创建渠道:

Future<void> setupFlutterNotifications() async {
  channel = const AndroidNotificationChannel(
    'high_importance_channel', // id
    'High Importance Notifications', // title
    description: 'This channel is used for important notifications.', // description
    importance: Importance.high,
  );

  flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

  // 强制创建渠道,覆盖已存在的同ID渠道
  await flutterLocalNotificationsPlugin
      .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()
      ?.createNotificationChannel(channel);

  await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
    alert: true,
    badge: true,
    sound: true,
  );
  isFlutterLocalNotificationsInitialized = true;
}

4. 推送Payload类型检查

FCM分为两类消息,需对应处理:

  • 通知消息:应用终止状态下由系统托盘直接展示,无需代码处理
  • 数据消息:必须通过_firebaseMessagingBackgroundHandler手动展示通知

若使用通知消息仍无法展示,需检查:

  • 设备通知权限是否开启
  • 推送消息的android.channel_id是否与代码中渠道ID一致
  • 通知渠道优先级是否为Importance.high(你的代码已配置)

测试时建议使用Firebase控制台分别测试两类消息的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:05:22