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

