Firebase Messaging 9.0+ 应用关闭时如何捕获通知点击跳转指定页面
实现方案(Firebase Messaging 9.0+)
问题根因
你当前的错误逻辑是在_firebaseMessagingBackgroundHandler中添加了跳转/跳转标记逻辑,这个回调是通知到达后台时就自动触发,和用户是否点击通知无关,所以才会出现未点击就跳转的问题。
应用完全关闭场景下的通知点击事件不需要用SharedPreference做标记,Firebase官方已经提供了专门的回调入口。
正确实现步骤
- 清理后台回调逻辑
删除_firebaseMessagingBackgroundHandler内所有跳转、存储跳转标记的代码,该回调仅用来处理不需要用户交互的后台操作(比如统计通知到达数、存储消息内容):
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async { await Firebase.initializeApp(); print("后台收到通知: ${message.messageId}"); // 仅保留非交互类逻辑,不要写任何跳转相关代码 }
- 冷启动点击事件捕获(应用完全关闭场景)
使用FirebaseMessaging.instance.getInitialMessage()捕获关闭状态下的通知点击事件,必须保证该逻辑在路由(你用的GetX路由)初始化完成后调用,不然跳转不会生效:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); // 注册后台消息回调 FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); // 先初始化应用,保证路由已经注册 runApp(const MyApp()); // 再处理关闭状态下的通知点击跳转逻辑 RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage(); if (initialMessage != null) { // 从initialMessage.data中取出你携带的业务参数,构造对应数据模型 Model model = Model(); // 建议先校验登录态/页面访问权限,无权限可以先跳登录页再二次跳转目标页 Get.offNamed(SCREEN_ROUTE, arguments: model); } // 后台挂起场景的点击逻辑你原有代码是正确的,保留即可 FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { Model model = Model(); Get.offNamed(SCREEN_ROUTE, arguments: model); }); // 前台收到通知的逻辑保留原有实现即可 FirebaseMessaging.onMessage.listen((RemoteMessage message) { // 自行处理前台通知弹窗逻辑 }); }
常见踩坑排查
如果发现getInitialMessage不触发,检查以下配置:
- 通知payload必须同时包含
notification和data字段,纯data消息在应用关闭状态下不会弹出系统通知,也无法触发点击事件 - Android端通知payload的
click_action必须设置为FLUTTER_NOTIFICATION_CLICK - iOS端需要开启Xcode中Background Modes的Remote notifications权限,且APNs payload配置符合规范
内容的提问来源于stack exchange,提问作者Lucas santos
相关产品推荐
相关产品推荐

