如何在 Flutter 中使用最新版本配置 Firebase 消息传递?



我使用以下代码行进行 Firebase 消息传递配置以进行颤振通知配置,但现在在集成到最新版本的 Firebase 消息传递后,它给了我错误

代码行

messaging.configure(onMessage: (Map<String, dynamic> message){}

飞镖分析中的错误

error: The method 'configure' isn't defined for the type 'FirebaseMessaging'. 

FirebaseMessaging.configure() 被 Firebase 团队删除:, per https://firebase.flutter.dev/docs/migration/#messaging —

原因:如果多次调用configure(),以前的实现会导致意外的副作用(要么注册 不同的处理程序或删除处理程序)。此更改允许开发人员 更明确地注册和删除处理程序 不会通过流影响他人。

使用FirebaseMessaging.onMessage方法获取消息

FirebaseMessaging.onMessage.listen((RemoteMessage message) {
RemoteNotification notification = message.notification;
AndroidNotification android = message.notification?.android;
});

使用FirebaseMessaging.onMessageOpenedApp替代onLaunchonResume处理程序:

FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print('A new onMessageOpenedApp event was published!');
Navigator.pushNamed(context, '/message',
arguments: MessageArguments(message, true));
});

请查看以下示例。

https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_messaging/firebase_messaging/example/lib/main.dart

@override
void initState() {
super.initState();
FirebaseMessaging.instance
.getInitialMessage()
.then((RemoteMessage message) {
if (message != null) {
Navigator.pushNamed(context, '/message',
arguments: MessageArguments(message, true));
}
});
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
RemoteNotification notification = message.notification;
AndroidNotification android = message.notification?.android;
if (notification != null && android != null) {
flutterLocalNotificationsPlugin.show(
notification.hashCode,
notification.title,
notification.body,
NotificationDetails(
android: AndroidNotificationDetails(
channel.id,
channel.name,
channel.description,
// TODO add a proper drawable resource to android, for now using
//      one that already exists in example app.
icon: 'launch_background',
),
));
}
});
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print('A new onMessageOpenedApp event was published!');
Navigator.pushNamed(context, '/message',
arguments: MessageArguments(message, true));
});
}

基于Jitesh的答案,对我来说,需要实现getInitialMessage以使应用程序终止时导航工作(替代onLaunch)

// workaround for onLaunch: When the app is completely closed (not in the background) and opened directly from the push notification
FirebaseMessaging.instance.getInitialMessage().then((RemoteMessage message) {
print('getInitialMessage data: ${message.data}');
_serialiseAndNavigate(message);
});
// onMessage: When the app is open and it receives a push notification
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
print("onMessage data: ${message.data}");
});
// replacement for onResume: When the app is in the background and opened directly from the push notification.
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print('onMessageOpenedApp data: ${message.data}');
_serialiseAndNavigate(message);
});

经过一些测试,以下是我的结论:

FirebaseMessaging.onMessageOpenedApp.listen((message)){} == "OLD" onResume() 仅在应用程序启动和/或在后台和通知单击时激活

FirebaseMessaging.instance.getInitialMessage() == "OLD" onLaunch() 仅在应用程序被杀死时有效!和通知点击

更新了一个:

FirebaseMessagingService 对于从应用入门开始非常重要。为此,您需要遵循以下内容: 首先声明此函数:

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
debugPrint("Firebase Messaging firebase is initialized");
await Firebase.initializeApp();
}

并在 app 的 main(){} 中调用此函数:

FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

然后您将能够使用这些函数:

FirebaseMessaging.onMessage方法获取消息

FirebaseMessaging.onMessage.listen((RemoteMessage message) {
RemoteNotification notification = message.notification;
AndroidNotification android = message.notification?.android;
});

FirebaseMessaging.onMessageOpenedApp作为 onLaunch 和 onResume 处理程序的替代品。

FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print('A new onMessageOpenedApp event was published!');
Navigator.pushNamed(context, '/message',
arguments: MessageArguments(message, true));
});

事件处理:

事件处理已经过重新设计,为开发人员提供了更直观的 API。现在可以通过流访问基于前台的事件:

FirebaseMessaging.onMessage返回在收到传入 FCM 有效负载时调用的流,而 Flutter 实例位于前台,其中包含 [RemoteMessage]。

FirebaseMessaging.onMessageOpenedApp返回一个 [Stream],当用户按下通过 FCM 显示的通知时,将调用该 [Stream]。这将替换以前的启动和恢复处理程序。

FirebaseMessaging.onBackgroundMessage()设置在应用处于后台或终止时触发的后台消息处理程序。 ios通知设置:

我知道有关 .configure() onlaunch/onresume 方法的变化。 它们被替换为

FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print('A new onMessageOpenedApp event was published!');
Navigator.pushNamed(context, '/message',
arguments: MessageArguments(message, true));
});

但这仅在应用程序仍在后台时才有效! 如果应用程序被杀死,它将不起作用。 如何实现这一点? 请问onLaunch()方法的"新"等价物是什么?

是的,我做了所有这些^^ 一切正常,但是当应用程序被杀死时,通知上的重定向。 我确实保证当应用程序被杀死时,onMessageOpenedApp.listen()不起作用。

证明是我有一个屏幕,可以记录收到的所有通知,并且在应用程序被杀死时在后台收到的通知是:

  • 接收和显示
  • 保留并显示在历史记录屏幕中

当应用程序被杀死并且您单击通知时,onMessageOpenedApp 无法被触发(因为 onLaunch()/onResume() 之前工作过...)。

这就是为什么我问如何使用新版本的Firebase实现这一目标?

相关内容

最新更新