firebase 应用程序在IOS上终止时Flutter FCM无法处理消息

flvtvl50  于 2023-05-18  发布在  iOS
关注(0)|答案(1)|浏览(148)

背景:我有一个flutter应用程序,其中我的目标是处理推送通知消息与firebase消息传递给订阅主题的用户。通知与使用处理程序中的SharedPreferences本地保存的数据一起发送。这适用于6个场景中的5个。

此场景适用于Android和IOS:

1.应用程序位于前台,调用处理程序并存储数据。
1.应用程序在后台,但没有被杀死/终止。调用处理程序并存储数据。
1.[仅适用于Android]应用程序从打开的应用程序视图终止。
当应用程序终止时,没有调用onBackgroundMessage()处理程序(即使推送通知通过并显示)的一个场景是在IOS上。然而,当您在第一个推送通知之后发送第二个推送通知时,处理程序会起作用,因为第一个推送通知会唤醒应用程序。
我甚至尝试使用getInitialMessage()来获取一个消息后,打开应用程序,我把我的main()功能。然而,该处理程序也不会被调用。因此,我目前无法处理流中的数据,这些数据来自iOS上的firebase推送通知,即使用户确实收到了推送通知。

我已经做过的事情:

  • 所有的内容都描述了here,直到高级步骤(在我的用例中我不需要自定义图像)
  • 我还启用了后台处理,以确保安全。
  • 使用真实的设备而不是模拟器进行测试。
  • 使用flutter run --release在发布模式下运行应用程序

下面是main和处理程序:

Future<void> firebaseMessagingForegroundHandler(
    RemoteMessage message, BuildContext context) async {
  // print("Handling a foreground message: ${message.notification?.title}");
  var prefs = await SharedPreferences.getInstance();

  var unreadMessages = prefs.getString('unreadMessages') ?? "";
  var readMessages = prefs.getString('readMessages') ?? "";
  int lastIndex = await getLastTabIndex();

  if (lastIndex == 2) {
    if (readMessages.isEmpty) {
      prefs.setString('readMessages', jsonEncode([message.data]));
    } else {
      var listWithReadMessages = jsonDecode(readMessages);
      listWithReadMessages.add(message.data);
      prefs.setString('readMessages', jsonEncode(listWithReadMessages));
    }
  } else {
    if (unreadMessages.isEmpty) {
      prefs.setString('unreadMessages', jsonEncode([message.data]));
    } else {
      var listWithUnreadMessages = jsonDecode(unreadMessages);
      listWithUnreadMessages.add(message.data);
      prefs.setString('unreadMessages', jsonEncode(listWithUnreadMessages));
    }
  }

  ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(content: Text('Nieuwe melding van ${message.data['sender']}')));
}

@pragma('vm:entry-point')
Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  debugPrint("Handling a background message: ${message.messageId}");
  //To ensure the sharedpreferences plugin is loaded in.
  DartPluginRegistrant.ensureInitialized();
  var prefs = await SharedPreferences.getInstance();
  prefs.reload();

  var unreadMessages = prefs.getString('unreadMessages');
  if (unreadMessages == null) {
    prefs.setString('unreadMessages', jsonEncode([message.data]));
  } else {
    var listWithUnreadMessages = jsonDecode(unreadMessages);
    listWithUnreadMessages.add(message.data);
    prefs.setString('unreadMessages', jsonEncode(listWithUnreadMessages));
  }
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );

  var messaging = FirebaseMessaging.instance;
  await messaging.requestPermission(
    alert: true,
    badge: true,
    sound: true,
  );

  FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler);

  await messaging
      .getInitialMessage()
      .then((message) => firebaseMessagingBackgroundHandler);

  runApp(const ProviderScope(child: MyApp()));
}

我在initState()中运行FirebaseMessaging.onMessage.listen((message),而不是在我的main()中运行FirebaseMessaging.onMessage.listen((message)

h5qlskok

h5qlskok1#

在应用程序能够通过FCM接收消息有效载荷之前,必须满足一些先决条件:

  • 申请必须至少打开一次(以便在FCM注册)。
    *在iOS上,如果用户将应用从应用切换器上滑开,则必须手动重新打开应用,后台消息才能重新开始工作。
  • 在Android上,如果用户强制退出设备设置应用,则必须手动重新打开应用程序,消息才能开始工作。
  • 在Web上,您必须使用Web推送证书请求令牌(使用getToken())。

我的强调。Source

相关问题