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

Flutter应用被杀重启后FCM通知延迟2分钟接收问题排查

问题分析与解决方案

针对应用被杀掉后收到FCM通知,重启应用延迟2分钟才接收的问题,从你的代码和配置来看,主要有以下几个可能的原因及修复方案:

1. 未注册FCM消息监听

你的代码中注释掉了addFirebaseMessagingListener(),这会导致应用重启后无法立即监听FCM的消息回调,只有等FCM内部轮询机制触发(通常约2分钟)才能收到消息。

修复:取消注释该方法,并确保在initializeRemoteNotifications之后调用,保证监听及时注册:

void main() async {
  await Future.delayed(const Duration(milliseconds: 200));

  WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();
  FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
  var connectivityProvider = ConnectivityProvider();
  await connectivityProvider.startMonitoring();
  await initializeRemoteNotifications(debug: true); // 先初始化远程通知
  await initializeLocalNotifications(debug: true);
  addFirebaseMessagingListener(); // 注册监听
  await NotificationController.getInitialNotificationAction(); // 再处理初始通知动作

  runApp(MyApp(connectivityProvider: connectivityProvider));
}

同时,确保addFirebaseMessagingListener()中正确实现FCM回调,覆盖前台、后台及冷启动场景:

void addFirebaseMessagingListener() {
  // 处理前台收到的消息
  FirebaseMessaging.onMessage.listen((RemoteMessage message) {
    if (message.notification != null) {
      // 调用本地通知展示逻辑
    }
  });

  // 处理点击通知打开应用的情况
  FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
    // 执行对应跳转或业务逻辑
  });

  // 处理应用从被杀状态启动时的初始消息
  FirebaseMessaging.instance.getInitialMessage().then((RemoteMessage? message) {
    if (message != null) {
      // 处理冷启动时的通知逻辑
    }
  });
}

2. 通知通道配置不匹配

你同时使用AwesomeNotifications和FlutterLocalNotificationsPlugin创建不同ID的通知通道,而Firebase默认指定的high_importance_channel仅由FlutterLocalNotificationsPlugin创建,存在通道管理冲突,可能影响通知的即时性。

修复:统一通知通道配置,二选一使用通知插件:

  • 方案一:改用AwesomeNotifications统一管理,修改AndroidManifest.xml将Firebase默认通道改为alerts:
<meta-data
  android:name="com.google.firebase.messaging.default_notification_channel_id"
  android:value="alerts" />

同时移除FlutterLocalNotificationsPlugin创建通道的代码,避免重复创建。

  • 方案二:保持Firebase默认通道high_importance_channel,在AwesomeNotifications中同步创建该ID的通道,确保通道配置一致。

3. 初始化顺序不合理

当前初始化流程中,先调用NotificationController.getInitialNotificationAction()再初始化远程通知,会导致无法及时获取FCM的冷启动初始消息。正确顺序应优先完成远程通知初始化,再处理初始通知动作。

修复:调整初始化顺序(参考第一点代码示例),确保initializeRemoteNotifications优先执行。

4. 不必要的启动延迟

await Future.delayed(const Duration(milliseconds: 200));会延迟应用初始化流程,可能影响FCM服务的及时启动,若无明确业务需求建议移除。

修复:删除启动延迟代码:

void main() async {
  // 移除该行延迟代码
  // await Future.delayed(const Duration(milliseconds: 200));

  WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();
  // ... 其余初始化代码
}

额外检查点

  • 确保initializeRemoteNotifications中完成Firebase权限请求:
Future<void> initializeRemoteNotifications({required bool debug}) async {
  FirebaseMessaging messaging = FirebaseMessaging.instance;
  NotificationSettings settings = await messaging.requestPermission(
    alert: true,
    badge: true,
    sound: true,
  );
  if (settings.authorizationStatus == AuthorizationStatus.authorized) {
    // 获取FCM Token等必要操作
  }
}
  • 检查Android设备电池优化设置,确保应用未被限制后台唤醒,否则会影响FCM消息的即时推送。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:28:14