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
相关产品推荐
相关产品推荐

