Flutter - FirebaseMessaging.onMessageOpenedApp.listen 未触发

问题描述 投票:0回答:5

我正在使用:

flutter version 2.2
firebase_messaging: ^10.0.2

我收到推送通知,然后单击它并打开应用程序。 然后我没有看到

FirebaseMessaging.onMessageOpenedApp.listen
被调用(回调正在向我发送调试电子邮件,但我没有收到任何邮件)

我的问题是

  1. (可选)如何使用 android studio debugur 模拟上面的情况来调试 android 应用程序,因此应用程序被杀死而不打开,然后通过通知打开

  2. 这里可能出现什么问题?为什么该流没有被触发?我在 main.dart 中初始化它

PS:所有其他方法都可以正常工作,因此如果应用程序位于前台,则 onMessage.listen 效果很好。我需要处理 onMessageOpenedApp,以便我可以根据通知信息将用户重定向到正确的视图

firebase flutter firebase-cloud-messaging
5个回答
10
投票

第一个问题:

要查看应用程序中的日志,您可以使用 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].

8
投票

我遇到这个问题已经有一段时间了,只是注意到,

firebase_messaging
插件提供了 3 种解决方法。

  1. 初始消息
  2. 留言
  3. 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
      }
    });

请注意,如果在

getInitializeMessage
文件中处理,每次用户打开应用程序时都会触发
main.dart
回调。所以也许
message
是 null,为了防止空指针异常,我在这里放置了
if(message != null)
条件


3
投票

要在应用程序被杀死时查看日志,您是否尝试过

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


1
投票

并在您的清单中添加以下代码:

<intent-filter> <action android:name="FLUTTER_NOTIFICATION_CLICK" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>

还要确保您已发送“click_action”:“FLUTTER_NOTIFICATION_CLICK”

从您的服务器端,例如:

DATA='{ "notification": { "body": "这是正文", "title": "这是标题" }, "data": { "att1": "值..", "att2 ": "值..", "click_action": "FLUTTER_NOTIFICATION_CLICK", }, "to": "" }'


0
投票

一个似乎对我有用的解决方案是在处理通知之前添加一点延迟。请参阅下面的代码片段。

final deepLink = message.deepLink;

if (deepLink != null) {
      // NOTE: Give some time for app to load up.
    await Future.delayed(const Duration(
        milliseconds: 400,
    ));

    final notification = CustomeNotification(
        deepLink: deepLink,
    );

    eventsAssistant.emit(
        event: RemoteNotificationEvent(
          notification: notification,
        ),
    );
}
© www.soinside.com 2019 - 2024. All rights reserved.