如何在 Flutter 中使用 Firebase Messaging ^8.0.0-dev.8 收到通知时 运行 函数?

How to run a function when a notification is received with Firebase Messaging ^8.0.0-dev.8 in Flutter?

您好,我正在使用 Flutter 构建我的应用程序,我需要在收到新通知时显示警报。
我一直在使用 firebase_messaging 7.0.3,但我 运行 使用 onBackgroundMessage 时出错。快速 Google 搜索帮助我发现我遇到的错误尚未修复。然而,其中一位开发人员在 20 天前发布了有关解决该问题的新版本软件包的更新。
新版本删除了旧的 onMessage 处理程序并引入了新的处理程序。 现在他们有了 return 流的新事件处理程序,但无法通过使用 .listen() 函数。每当我收到通知时,控制台都会打印 D/FLTFireMsgReceiver(22032): broadcast received for message.listen() 中的代码不会执行。

Here 是一篇关于 Firebase Flutter 的文章的 link,该文章是使用新版本包的指南。 这是我的代码:

...
FirebaseMessaging.onMessage.listen((event) {
 // do something
});
FirebaseMessaging.onMessageOpenedApp.listen((event) {
 // do something
});
FirebaseMessaging.onBackgroundMessage((message) {
 // do something
 return;
 }
...

我发现让事件触发的解决方案是始终调用:

await FirebaseMessaging.instance.getToken();

紧接着

await Firebase.initializeApp();

一旦我调用它,FirebaseMessaging.onMessage.listen 就会按预期捕获事件。

  • 当我的应用程序处于休眠模式时,我收到了相同的日志以获取高优先级的数据通知。 这是因为 firebase-messaging 插件中的一些问题。
  • Firebase_messaging插件内部使用JobIntentService处理后台fcm通知
  • JobIntentService 在 AndroidO 或更高版本中有一个约束,当 运行Job 将受制于标准的 JobScheduler 策略。当设备处于休眠模式时,作业不会立即 运行。 (reference link)
  • 在 firebase_messaging git 存储库 (bug link)
  • 中提出了同样的问题

解决方案

  • One Signal(另一个推送通知 provider)通过修改版本的 JobIntentService 解决了这个问题。 (OneSignal Solution)
  • 在较高级别,即使在 Android O 及更高级别,它也使用唤醒锁来向 [​​=54=] 服务发送高优先级 fcm 通知。
  • 通过编辑相应的文件在您的 ide 中添加此 Pull Request 更改。

TL;DR

Add this Pull Request changes in your ide by editing respective files. Send Data notification with High priority.

FCM 负载:

{
"message": {
    "token": "fcm_client_token",
    "data": {
        "title": "Hello",
        "body": "Test Message"
    },
    "android": {
        "priority": "high"
    }
}

}