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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:53:28