Flutter Android应用终止状态下点击FCM通知触发函数咨询
解决应用终止状态下点击通知的处理问题
针对你使用flutter_local_notifications: ^15.1.0+1结合FCM时,应用终止状态下点击通知无法触发onDidReceiveNotificationResponse的问题,可通过以下方式处理:
核心思路
应用终止时Flutter引擎尚未启动,onDidReceiveNotificationResponse回调无法触发。需通过flutter_local_notifications提供的getInitialNotificationResponse方法,在应用启动初期获取通知点击的响应数据,同时配合FCM后台消息回调确保通知正确展示。
具体实现步骤
1. 初始化时获取启动通知响应
在main函数中,初始化flutter_local_notifications后,调用getInitialNotificationResponse方法,获取应用从终止状态被通知点击启动时的响应数据,并处理业务逻辑:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 初始化flutter_local_notifications final FlutterLocalNotificationsPlugin localNotifications = FlutterLocalNotificationsPlugin(); const AndroidInitializationSettings androidInit = AndroidInitializationSettings('@mipmap/ic_launcher'); final DarwinInitializationSettings iosInit = DarwinInitializationSettings(); final InitializationSettings initSettings = InitializationSettings( android: androidInit, iOS: iosInit, ); await localNotifications.initialize( initSettings, onDidReceiveNotificationResponse: handleNotificationTap, // 前台/后台点击处理 onDidReceiveBackgroundNotificationResponse: handleNotificationTap, // 后台(非终止)点击处理 ); // 处理终止状态下的通知点击 final NotificationResponse? initialResponse = await localNotifications.getInitialNotificationResponse(); if (initialResponse != null) { handleNotificationTap(initialResponse); } // 初始化FCM await Firebase.initializeApp(); FirebaseMessaging.onBackgroundMessage(_handleFcmBackgroundMessage); runApp(const MyApp()); } // 统一处理通知点击逻辑 void handleNotificationTap(NotificationResponse response) { // 解析payload,执行跳转或其他业务逻辑 final String? payload = response.payload; if (payload != null) { final Map<String, dynamic> data = jsonDecode(payload); print('点击通知,标题:${data['title']},内容:${data['body']}'); // 此处可添加页面导航等业务逻辑 } }
2. FCM后台消息处理(终止状态触发)
对于FCM的data类型消息,应用终止时会触发onBackgroundMessage回调,需在此处调用flutter_local_notifications展示自定义通知,并将FCM的data数据作为payload传递:
Future<void> _handleFcmBackgroundMessage(RemoteMessage message) async { await Firebase.initializeApp(); final FlutterLocalNotificationsPlugin localNotifications = FlutterLocalNotificationsPlugin(); // 配置通知渠道(Android需提前创建) const AndroidNotificationDetails androidDetails = AndroidNotificationDetails( 'fcm_channel', 'FCM通知渠道', channelDescription: '接收FCM数据消息的通知渠道', importance: Importance.max, priority: Priority.high, ); const DarwinNotificationDetails iosDetails = DarwinNotificationDetails(); const NotificationDetails notificationDetails = NotificationDetails( android: androidDetails, iOS: iosDetails, ); // 展示本地通知,将FCM的data转为json作为payload await localNotifications.show( DateTime.now().millisecondsSinceEpoch % 10000, message.data['title'], message.data['body'], notificationDetails, payload: jsonEncode(message.data), ); }
3. 平台配置补充
- Android:确保
AndroidManifest.xml中已配置FCM相关权限,可在应用启动时提前创建通知渠道。 - iOS:在
Info.plist中添加后台推送权限:
并在应用启动时请求推送权限:<key>UIBackgroundModes</key> <array> <string>remote-notification</string> </array>await FirebaseMessaging.instance.requestPermission( alert: true, badge: true, sound: true, );
关键说明
- 只有通过
flutter_local_notifications展示的通知,getInitialNotificationResponse才能获取到响应数据;若使用FCM默认展示通知,需额外处理FCM启动参数。 payload用于传递自定义数据,需确保展示通知时正确传入,以便点击时解析业务逻辑。
内容的提问来源于stack exchange,提问作者sanjay c
相关产品推荐
相关产品推荐

