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

Firebase发送的通知接收延迟如何解决?附Flutter端通知监听代码

Flutter Firebase云消息通知接收延迟解决方案

1. 调整FCM消息投递优先级

  • Firebase控制台发送通知时,进入高级选项,将消息优先级设置为high,不要使用默认的普通优先级。普通优先级下FCM会为了省电合并批量投递,可能产生数分钟到数十分钟的延迟,高优先级消息会被立即投递。
  • 如果通过服务端发送而非控制台,需要在请求体中添加priority: "high"字段,安卓渠道额外配置android: { "priority": "high" }。

2. 解除安卓系统后台限制

  • 针对安卓10及以上系统,需引导用户手动开启APP的自启动权限、后台活动权限,关闭电池优化策略。系统默认会限制后台应用的网络唤醒,导致进程被挂起时无法及时接收FCM广播。
  • 国内定制ROM(小米、华为、OV等)需额外适配厂商推送通道,FCM在国内网络环境下本身可用性不稳定,优先接入厂商推送通道作为补充。

3. 完善消息监听逻辑

你当前的代码仅处理了前台运行状态的通知回调,缺失后台/进程杀死状态的消息处理,参考如下逻辑补全:

// 应用启动时优先初始化本地通知和FCM监听
Future<void> initFCM() async {
  // 前台消息监听(你已有的逻辑,可补充异常捕获)
  FirebaseMessaging.onMessage.listen((RemoteMessage message) {
    try {
      RemoteNotification? notification = message.notification;
      AndroidNotification? android = message.notification?.android;
      if (notification != null && android != null) {
        flutterLocalNotificationsPlugin.show(
          notification.hashCode,
          notification.title,
          notification.body,
          NotificationDetails(
            android: AndroidNotificationDetails(
              channel.id,
              channel.name,
              channel.description,
              color: Colors.blue,
              playSound: true,
              icon: 'ic_launcher',
              importance: Importance.max,
              priority: Priority.high,
            ),
          ),
        );
      }
      // 额外处理数据类型消息
      if (message.data.isNotEmpty) {
        // 自定义数据处理逻辑
      }
    } catch (e) {
      // 异常捕获避免监听中断
      debugPrint("通知展示异常: $e");
    }
  });

  // 注册后台消息监听(必须是顶层函数)
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
}

// 顶层后台消息处理函数
@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  // 后台状态下的通知/数据处理逻辑
}
  • 注意本地通知的安卓通道配置必须将importance设为max、priority设为high,保证通知弹出权限和即时性。
  • 不要在页面级组件中初始化FCM监听,需在main.dart中应用初始化时就完成注册,避免监听注册延迟导致错过消息。

4. 排查其他影响因素

  • 确认测试设备网络环境稳定,代理、VPN、防火墙可能会拦截FCM的长连接导致消息延迟。
  • 如果发送的是可折叠消息(设置了collapse_key),FCM只会投递最新的一条同类消息,之前的消息会被折叠,可能被误以为是延迟丢失。
  • 升级firebase_messaging和flutter_local_notifications依赖到最新稳定版,旧版本存在已知的消息投递延迟bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:06:05