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

Flutter应用iOS端Firebase所有notification_事件失效,打开率始终为0

问题分析与解决方案

核心问题原因

iOS端Firebase所有notification_前缀的事件无法触发,本质是Flutter Firebase Messaging在iOS上的事件追踪依赖于正确的通知交互回调处理——默认情况下如果没有配置前台通知展示、未监听全场景的通知点击事件,Firebase Analytics无法自动捕获这些行为。另外你使用的provisional: true是静默推送权限,可能会限制通知交互事件的上报。

必须做的配置与代码修改

1. 完善iOS原生配置

  • 在Info.plist中添加后台模式权限:
    <key>UIBackgroundModes</key>
    <array>
      <string>remote-notification</string>
    </array>
    
  • 确保Xcode项目中已启用Push Notifications能力(在Signing & Capabilities面板中添加)。

2. 补充全场景通知点击监听

你的代码仅处理了应用冷启动时的通知点击(getInitialMessage),但缺少应用在前台/后台活跃状态下的通知点击监听,这是iOS端notification_open事件不触发的关键。在main函数中添加以下代码:

// 监听应用活跃状态下的通知点击
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) async {
  // 保留你的原有业务逻辑
  final prefs = await SharedPreferences.getInstance();
  String customUrl = message.data['customURL'] ?? '';
  await prefs.setString('customURL', customUrl);
  
  // 手动上报notification_open事件(若默认事件仍不触发)
  await FirebaseAnalytics.instance.logEvent(
    name: 'notification_open',
    parameters: {
      'notification_id': message.messageId,
      'custom_url': customUrl,
    },
  );
});

3. 处理前台通知展示

iOS上应用在前台时,默认不会弹出系统通知栏,用户无法点击通知,自然无法触发事件。需要借助flutter_local_notifications插件手动展示通知:

// 初始化flutter_local_notifications实例
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
    FlutterLocalNotificationsPlugin();

// 在main函数中完成初始化配置
const AndroidInitializationSettings initializationSettingsAndroid =
    AndroidInitializationSettings('@mipmap/ic_launcher');
final IOSInitializationSettings initializationSettingsIOS =
    IOSInitializationSettings(
  requestAlertPermission: true,
  requestBadgePermission: true,
  requestSoundPermission: true,
);
final InitializationSettings initializationSettings = InitializationSettings(
  android: initializationSettingsAndroid,
  iOS: initializationSettingsIOS,
);
await flutterLocalNotificationsPlugin.initialize(initializationSettings);

// 监听前台收到的通知并弹出系统通知
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
  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(
          'your_channel_id',
          'your_channel_name',
          'your_channel_description',
          importance: Importance.max,
          priority: Priority.high,
        ),
        iOS: IOSNotificationDetails(),
      ),
    );
  }
});

4. 调整通知权限请求

provisional: true是静默推送权限,不会弹出用户授权弹窗,无法获取通知提醒权限,建议改为主动请求完整权限:

await FirebaseMessaging.instance.requestPermission(
  alert: true,
  badge: true,
  sound: true,
  // provisional: true, // 注释此行,改为请求明确权限
);

5. 手动上报notification_系列事件

如果默认的notification_事件仍未触发,可以在对应回调中手动上报:

  • 通知收到时:await FirebaseAnalytics.instance.logEvent(name: 'notification_received');
  • 通知点击时:await FirebaseAnalytics.instance.logEvent(name: 'notification_open');

总结

是的,你需要为iOS端添加自定义的通知交互事件处理逻辑,包括前台通知展示、全场景的通知点击监听,必要时手动上报Firebase Analytics事件。按上述步骤修改后,iOS端的notification_系列事件应该能正常被追踪。

内容的提问来源于stack exchange,提问作者Joshua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:25:38