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

时间:2021-03-29 10:40:35

标签: flutter push-notification

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

谢谢

2 个答案:

答案 0 :(得分:2)

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

根据文档:

<块引用>

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

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

如果不满足这些条件,您的通知将永远不会收到。如果没有收到通知,那么你打算用本地通知显示什么?

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

在 iOS 上,您仍然会面临与后台获取相同的问题。根据他们的文档:

<块引用>

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

Background fetch

答案 1 :(得分:2)

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

  1. 应用关闭时未收到通知
  2. 如何使用 flutter_local_notifications 包向其他设备发送通知。
<块引用>

对于“未接收”部分:

如果您已正确集成 FCM,则不必担心 在后台或后台根本没有收到推送通知 该应用程序已被终止。

FCM 会自动为您处理推送通知 在后台或应用程序已被终止。

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

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


<块引用>

现在,对于“通过 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