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
相关产品推荐
相关产品推荐

