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

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权限并主动请求:
    if (Platform.isAndroid) {
      final status = await Permission.notification.request();
      if (status != PermissionStatus.granted) {
        // 提示用户开启通知权限
      }
    }
    
    同时在AndroidManifest.xml中声明权限:
    <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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:32:04