Flutter中FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage)无效问题咨询
Flutter FCM通知点击无响应问题排查与解决
1. 检查FCM通知Payload配置
后台发送的通知必须包含正确触发字段,否则点击事件无法被Flutter捕获:
- Android平台:在
notification节点中添加click_action: FLUTTER_NOTIFICATION_CLICK,同时通过data字段传递页面跳转参数,示例Payload:
{ "notification": { "title": "测试通知", "body": "点击跳转详情页", "click_action": "FLUTTER_NOTIFICATION_CLICK" }, "data": { "target_screen": "detail", "item_id": "1001" }, "to": "设备令牌" }
- 对应AndroidManifest配置:在
MainActivity标签内添加intent filter,让系统将点击事件转发给Flutter:
<intent-filter> <action android:name="FLUTTER_NOTIFICATION_CLICK" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
2. 配置Flutter端点击监听逻辑
根据应用状态(前台/后台/已杀死),分别配置对应的监听:
后台/前台切换时的点击监听
处理应用处于后台时点击通知的场景:
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { // 解析data字段,执行页面跳转 if (message.data['target_screen'] == 'detail') { Navigator.pushNamed( context, '/detail', arguments: message.data['item_id'], ); } });
应用从杀死状态启动的点击监听
处理点击通知直接启动应用的场景,建议在main函数或根Widget的initState中初始化:
FirebaseMessaging.instance.getInitialMessage().then((RemoteMessage? message) { if (message != null) { WidgetsBinding.instance.addPostFrameCallback((_) { if (message.data['target_screen'] == 'detail') { Navigator.pushNamed( context, '/detail', arguments: message.data['item_id'], ); } }); } });
前台通知的点击处理
应用在前台时,FCM不会自动弹出系统通知,需借助flutter_local_notifications自定义通知并添加点击回调:
// 初始化通知插件 final FlutterLocalNotificationsPlugin _notificationsPlugin = FlutterLocalNotificationsPlugin(); // 初始化配置 const AndroidInitializationSettings _androidInit = AndroidInitializationSettings('@mipmap/ic_launcher'); final InitializationSettings _initSettings = InitializationSettings(android: _androidInit); await _notificationsPlugin.initialize( _initSettings, onDidReceiveNotificationResponse: (NotificationResponse response) { // 解析自定义通知的payload if (response.payload != null) { final data = jsonDecode(response.payload!); Navigator.pushNamed( context, data['target_screen'], arguments: data['item_id'], ); } }, ); // 监听前台FCM消息,显示自定义通知 FirebaseMessaging.onMessage.listen((RemoteMessage message) { final notification = message.notification; final android = message.notification?.android; if (notification != null && android != null) { _notificationsPlugin.show( notification.hashCode, notification.title, notification.body, NotificationDetails( android: AndroidNotificationDetails( 'app_notification_channel', '应用通知', channelDescription: '应用通知渠道', icon: android.smallIcon, ), ), payload: jsonEncode(message.data), ); } });
3. 平台权限与配置检查
- Android 13+:需添加POST_NOTIFICATIONS权限并主动请求:
同时在AndroidManifest.xml中声明权限:if (Platform.isAndroid) { final status = await Permission.notification.request(); if (status != PermissionStatus.granted) { // 提示用户开启通知权限 } }<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> - iOS:确保Info.plist中已配置
FirebaseAppDelegateProxyEnabled为YES,并在应用启动时请求推送权限:await FirebaseMessaging.instance.requestPermission( alert: true, badge: true, sound: true, );
4. 区分测试场景
- 应用前台:必须通过自定义通知处理点击,系统不会自动弹出通知
- 应用后台:点击系统通知触发
onMessageOpenedApp - 应用已杀死:点击通知启动应用,触发
getInitialMessage
内容的提问来源于stack exchange,提问作者Franky Mbieleu
相关产品推荐
相关产品推荐

