当应用程序关闭时在 Flutter 中推送通知

Posted

技术标签:

【中文标题】当应用程序关闭时在 Flutter 中推送通知【英文标题】:Push Notification in Flutter when the app is turn off 【发布时间】:2021-06-25 09:28:10 【问题描述】:

我实现了推送通知(云消息传递),但是当应用程序完全关闭时我无法收到通知。 所以,我搜索了一下,发现我需要使用本地通知。 我开始使用本地通知,但我发现本地通知是基于用户方面的,例如由用户自己安排事件。那么问题来了,如何使用 flutter_local_notifications 向所有用户发送通知?

谢谢

【问题讨论】:

“完全关闭”到底是什么意思?如果您的意思是在他们强制关闭应用程序之后,那么您可能需要考虑您是否真的想要并且需要向这些用户显示通知。强制关闭应用程序的用户没有理由期望应用程序正常运行,因此这可能不是问题。 我的意思是当应用程序关闭时(不在后台工作) 您能分享一下您在哪里/如何发现需要本地通知的吗? 假设他正在使用 api 调用来获取通知数据。如果应用程序被完全杀死,则在后台从 api 获取通知数据并将其显示为通知。 我已经在java android中实现了相同问题的解决方案。现在我也想在颤振中看到它。在 java 中,我使用 Work Manager 进行本地通知。 【参考方案1】:

这个问题实际上分为两部分。

    应用关闭时未收到通知 如何使用flutter_local_notifications 包向其他设备发送通知。

对于“未接收”部分:

如果您已正确集成 FCM,则不必担心 在后台或 该应用程序已被杀死。

FCM 会在您使用时自动为您处理推送通知 在后台或应用程序已被杀死。

请确保您已将 FCM 正确集成到您的颤振中 项目。

关注此link 以进行正确集成。此外,ios 集成有点棘手和冗长,请按照此link 进行 APNs 集成。 如果您没有使用 FCM 正确设置 APN,Apple 将无法识别后台状态的推送通知触发器。


现在,对于“通过flutter_local_notifications 包向其他设备发送通知:

您不能通过 Flutter_local_notifications 推送通知,该通知将委托给 FCM。为此,您必须通过 REST API 调用发送HTTP request。

示例代码如下:

Future<Response> publishNotification() async 
  return await post(
    'https://fcm.googleapis.com/fcm/send',
    headers: <String, String>
      'Content-Type': 'application/json',
      'Authorization': 'key=$firebaseServerKey',
    ,
    body: jsonEncode(
      <String, dynamic>
        "to": firebaseDeviceToken,
        'priority': 'high',
        "data": <String, dynamic>
          'click_action': 'FLUTTER_NOTIFICATION_CLICK',
          "body": "Order#10",
          "title": "New Order",
          "status": "done",
          "screen": "NotificationPage",
          "description": "Order Details",
        
      ,
    ),
  );

您可以添加我想向多个设备发送通知。 为此,只需将token 替换为registration_ids 并将您的设备令牌列表放在registration_ids 上。

示例代码:

Future<Response> publishNotification() async 
  return await post(
    'https://fcm.googleapis.com/fcm/send',
    headers: <String, String>
      'Content-Type': 'application/json',
      'Authorization': 'key=$firebaseServerKey',
    ,
    body: jsonEncode(
      <String, dynamic>
        "registration_ids": ["token_1", "token_2", ...],
        'priority': 'high',
        "data": <String, dynamic>
          'click_action': 'FLUTTER_NOTIFICATION_CLICK',
          "body": "Order#10",
          "title": "New Order",
          "status": "done",
          "screen": "NotificationPage",
          "description": "Order Details",
        
      ,
    ),
  );

我希望我能覆盖你。快乐编码:D

【讨论】:

我们如何发送没有数据的 FCM 通知。例如,用户对某人的帖子发表了评论。现在我们要将通知发送给该用户。我们如何通过 FCM 发送该通知? 此链接可能有助于您理解,firebase.google.com/docs/cloud-messaging/… 但这不是为了扑朔迷离。 你想从flutter项目发送通知吗?不是来自服务器端? 你可以简单地从你的 Flutter 项目中发出一个 HTTP 请求。【参考方案2】:

我无法想象本地通知会解决您的问题。

根据文档:

在应用程序可以通过 FCM 接收消息负载之前,必须满足一些先决条件:

应用程序必须至少打开一次(以允许向 FCM 注册)。 在 iOS 上,如果用户从应用切换器中滑动应用程序,则必须再次手动重新打开它,后台消息才能重新开始工作。 在 Android 上,如果用户从设备设置中强制退出应用,则必须再次手动重新打开它才能让消息开始工作。

如果不满足这些条件,则根本不会收到您的通知。如果没有收到通知,那么你打算在本地通知中显示什么?

您可以做的是将本地通知与后台获取结合使用。通过后台获取,您可以检查一些 api 是否有一些通知。您必须以某种方式弄清楚哪些已经呈现,哪些尚未呈现。然后你可以使用本地通知来呈现这些。在这种情况下,我认为放弃云消息传递并仅使用后台获取 + 本地通知会更容易。

在 iOS 上,后台获取仍然会遇到同样的问题。根据他们的文档:

当您的应用终止时,iOS 不再触发事件。

Background fetch

【讨论】:

后台抓取是什么意思? 能否提供后台抓取+本地通知的示例代码? 兄弟,能否解释一下后台获取代码。 如果您在答案中添加带有解释的后台获取代码会很棒。 当您的应用程序终止时,iOS 不再触发事件。我认为没有IOS是没用的。如果不支持IOS,使用flutter有什么意义。你能为安卓和IOS提供任何相同逻辑的东西吗?

以上是关于当应用程序关闭时在 Flutter 中推送通知的主要内容,如果未能解决你的问题,请参考以下文章

使用 GCM 关闭应用程序时在 iOS 中接收推送通知

应用程序关闭时推送通知不起作用 - Flutter

Flutter Firebase 消息传递 - 应用打开时未显示推送通知

如何在应用程序关闭时在颤动中执行后台任务?

应用程序运行时在 iOS 中抑制/隐藏推送通知

Flutter:即使应用关闭也会推送通知