Flutter -未触发FirebaseMessaging.onMessageOpenedApp.listen

mnemlml8  于 2023-03-31  发布在  Flutter
关注(0)|答案(3)|浏览(197)

我正在使用:

flutter version 2.2
firebase_messaging: ^10.0.2

我收到推送通知,然后点击它,应用程序被打开。然后我没有看到FirebaseMessaging.onMessageOpenedApp.listen被调用(回调正在向我发送调试电子邮件,但我没有收到任何邮件)
我的问题是
1.(可选)我如何调试android应用程序与android studio debugur模拟上述情况下,所以应用程序被杀死没有打开,然后通过通知打开
1.这里有什么问题?为什么没有触发流?我在main.dart中初始化它
PS:所有其他方法工作正常,所以如果应用程序在前台,onMessage.listen工作得很好。我需要处理onMessageOpenedApp,这样我就可以根据通知信息将用户重定向到正确的视图

vmdwslir

vmdwslir1#

对于第一个问题:
要查看应用中的日志,您可以使用Android Studio或IntelliJ中的“Logcat”选项卡:

对于第二个问题:
如果您的应用被终止,而您希望接收通知单击回调,则应用途:

FirebaseMessaging.instance.getInitialMessage().then((message) {
  if (message != null) {
    // DO YOUR THING HERE
  }
});

,因为根据Flutter团队对onMessageopenedApp函数的评论:

/// If your app is opened via a notification whilst the app is terminated,
  /// see [getInitialMessage].
5q4ezhmt

5q4ezhmt2#

要查看日志时,应用程序被杀死在您的情况下,你尝试flutter logs命令,只需插入您的设备在usb调试和运行flutter logs在您的终端所有您的print消息将显示在这里.
关于FirebaseMessaging.onMessageOpenedApp.listen在应用程序启动时被调用是因为您需要定义后台消息处理程序

/// Define a top-level named handler which background/terminated messages will
/// call.
///
/// To verify things are working, check out the native platform logs.
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  // If you're going to use other Firebase services in the background, such as Firestore,
  // make sure you call `initializeApp` before using other Firebase services.
  await Firebase.initializeApp();
  print('Handling a background message ${message.messageId}');
}

查看完整的firebase_messaging示例main.dart

vjhs03f7

vjhs03f73#

我已经在这个问题上有一段时间了,只是注意到,有3个解决办法提供的firebase_messaging插件。
1.初始信息
1.关于消息

  1. onMessageOpenedApp
    您可以在下面找到详细信息:
    1.当应用程序处于打开状态时,onMessage回调将被调用,实际上是一个Stream<RemoteMessage>,并且在通知托盘中不会有通知。
FirebaseMessaging.onMessage.listen((message) {
      // handle accordingly
    });

1.当应用程序处于暂停状态,即应用程序在后台处于活动状态时,通知托盘中会出现一个通知,单击该通知将调用onMessageOpenedApp回调,这也是一个Stream<RemoteMessage>,因此您可以像这样处理它

FirebaseMessaging.onMessageOpenedApp.listen((message) {
      // handle accordingly
    });

1.第三种情况是当应用程序处于终止或杀死状态时。在这种情况下,通知将显示在通知状态,但由于您的应用程序未处于活动状态,因此无法触发Stream<RemoteMessage>。因此,在这种情况下,firebase_messaging为您提供了getInitialMessage回调,实际上是Future<RemoteMessage?>。您可以像这样使用它:

FirebaseMessaging.instance.getInitialMessage().then((message) {
      if (message != null) {
        // handle accordingly
      }
    });

请注意,如果在main.dart文件中处理,则每次用户打开应用程序时都会触发getInitializeMessage回调。因此,可能message为null,为了防止空指针异常,我在这里放置了if(message != null)条件

相关问题