【问题标题】:FCM with AWS SNS带有 AWS SNS 的 FCM
【发布时间】:2016-11-13 00:25:03
【问题描述】:

我正在为我的 android 项目使用 AWS 资源,我计划使用 AWS SNS 为我的项目添加推送通知服务。很少有问题困扰着我。我没有发现任何关于这些的问题,除了一两个但解释不清楚的问题。

1.AWS是否支持FCMSNSGCM 一起工作。但 Google 建议使用 FCM 而不是 GCM。我没有找到支持FCMAWS

2.AWS 是否在发送推送通知后将消息(或数据)存储到他们的数据库中?

3.我尝试将FCM api key放入SNS应用平台,为什么显示无效参数?

【问题讨论】:

  • SNS 尚不支持 FCM,它使用了已弃用的 GCM 版本。您从哪里获取 API 密钥?
  • 我尝试的是,我尝试将 FCM 的 api 密钥放在 SNS 中,但没有成功,在阅读 AWS(SNS) 中的文档后,他们提到要放置服务器密钥。我试过了,效果很好。我可以通过 SNS 为 FCM 发送推送通知。不知道它起作用的确切原因。您确定 SNS 目前不支持 FCM 吗?
  • 发送GCM(现为FCM)消息需要服务器密钥是正确的。在客户端(移动设备)上,GCM 和 FCM 通常是相同的,因此两者都会以预期的方式接收消息。但是,有些 FCM 功能将无法使用,例如:主题消息传递。
  • fmc 可以使用 sns 主题吗?谢谢你这么棒的回答
  • 首先使用 SNS 有什么好处? FCM 还不够吗?

标签: android amazon-web-services google-cloud-messaging amazon-sns firebase-cloud-messaging


【解决方案1】:

FCM 向后兼容 GCM。在 AWS 上设置 FCM 的步骤与 GCM set up procedure 相同,并且(至少目前)FCM 在服务器端配置方面与 GCM 和 SNS 透明地工作。

然而,如果您向 Android 设备发送 data 有效载荷,除非您实现扩展 FirebaseMessagingServiceclient side service,否则它们将不会被处理。 AWS 控制台中的默认 JSON 消息生成器发送 data 消息,除非实现上述服务,否则您的应用程序将忽略这些消息。为了在初始测试中绕过这个问题,您可以提供一个自定义的 notification 有效负载,您的设备将接收该有效负载(只要您的应用不在前台)

Google 提供了GCM-FCM migration instructions,但是您需要进行的更改主要是在应用端。

使用 SNS 在您的应用上测试 GCM/FCM 需要遵循的步骤是:

  1. 创建Platform Application in SNS,选择Google Cloud Messaging (GCM) 作为推送通知平台,并在API 密钥 字段中提供您的Server API key。李>
  2. 选择平台应用程序并单击创建平台端点按钮。
  3. 提供您的应用生成的 InstanceID(设备令牌)。您必须扩展 FirebaseInstanceIDService 并覆盖 onTokenRefresh 方法才能在您的 Android 应用程序中看到它。一旦您have done this,卸载并重新安装您的应用,您的令牌应该会在首次启动时打印到 Android Studio 中的调试控制台。
  4. 点击添加端点按钮。
  5. 单击您的平台应用程序的 ARN 链接。
  6. 为您的设备选择新创建的端点,然后单击发布到端点按钮。
  7. 选择 JSON 消息格式,然后单击 JSON 消息生成器按钮。
  8. 输入测试消息并点击Generate JSON按钮
  9. 现在是“陷阱部分”。

SNS 生成的消息格式如下:

{
"GCM": "{ \"data\": { \"message\": \"test message\" } }"
}

正如我们之前提到的,如果没有实现接收它们的服务,data 有效负载将被忽略。我们想在不编写太多代码的情况下进行测试,因此我们应该发送一个notification 有效载荷。为此,只需将 JSON 消息更改为:

{
"GCM": "{ \"notification\": { \"title\": \"test title\", \"body\": \"test body\" } }"
}

(有关 FCM 消息的 JSON 格式的更多信息,请参阅FCM documentation。)

完成此操作后,请确保您的应用未在设备上运行,然后点击发布消息按钮。您现在应该会在您的设备上看到一个弹出通知。

您当然可以通过 Amazon SNS API 以编程方式完成所有这些操作,但是所有示例似乎都使用 data 有效负载,因此您需要牢记这一点并生成适合您用例的有效负载。

【讨论】:

  • 出色的答案,谢谢。值得注意的是,json 在配置选项方面有一定的深度——请参阅developers.google.com/cloud-messaging/concept-options——尽管我没有测试任何 FCM 特定的功能。
  • data 消息使用 sns 可以正常工作,即使客户端应用程序没有实现 FCM 而是 GCM。在我的应用程序中,我尚未在客户端升级到 FCM,但使用 SNS 的 FCM 也适用于 data 消息。它不应该工作吗?
  • SNS 使用 GCM,因此如果您使用 GCM 客户端,它应该正常运行(直到 Google 决定停用 GCM)。这个问题更多地与 AWS 上的 FCM 支持有关(通过 Google API 端的向后兼容性支持)
  • fmc 可以使用 sns 主题吗?谢谢你这么棒的回答
  • 欢迎 - 是的,您可以像往常一样将移动推送(即 GCM->FCM)端点单独订阅到 SNS 主题,但是这会在 AWS 中生成大量消息。如果您使用 FCM 客户端,另一种选择是使用 FCM 主题或用户细分,它们只会通过 Google 的服务器传输
【解决方案2】:

现在您可以转到您的 Firebase 控制台 (https://console.firebase.google.com/) 选择您的项目,点击齿轮图标并选择项目设置,然后点击云消息选项卡...

您将看到作为 GCM API 密钥的旧服务器密钥,并且您可以选择生成新的服务器密钥,即 FCM 版本

SNS 将接受这两个版本,但他们的菜单选项仍在 GCM 下分类

这是供您参考的图片:

请注意,您可以“意外”删除您的服务器密钥,但旧服务器密钥不可删除。此外,如果您单击添加服务器密钥按钮,您将在第一个服务器密钥下方获得一个新服务器密钥,没有警告! ...干得好 Google ;)

【讨论】:

    【解决方案3】:

    对 Nathan Dunn 的出色答案的补充说明。 如何将带有通知的数据从 SNS 发送到 Firebase。

    我们需要将数据添加到 Json(在通知内):

    {
        "default": “any value", 
         "GCM": "{ \"notification\": { \"body\": \”message body\”, \”title\”: \”message title \”, \"sound\":\"default\" } , \"data\" : {\”key\" : \”value\", \”key2\" : \”value\” } }”
    }
    

    在您的 FirebaseMessagingService 实现中(Xamarin 示例)

    public override void OnMessageReceived(RemoteMessage message)
    {
    
        try
        {
    
            var body = message?.GetNotification()?.Body;
            var title = message?.GetNotification()?.Title;
            var tag = message?.GetNotification()?.Tag;
            var sound = message?.GetNotification()?.Sound;
    
            var data = message?.Data
            foreach (string key in data.Keys)
            {
                // get your data values here
            }
    
        }
        catch (Exception e)
        {
        }
    }
    

    【讨论】:

    • FCM 令牌在哪里?
    • 如何在有效载荷中发送图像 URL
    【解决方案4】:

    我尝试使用通知负载而不是数据的解决方案,但我没有在移动设备上收到推送通知。我发现本教程https://youtu.be/iBTFLu30dSg 带有英文字幕,说明如何逐步将 FCM 与 AWS SNS 一起使用,以及如何从 AWS 控制台发送推送通知并使用 aws php sdk 在 php 上实现它的示例。这对我帮助很大。

    【讨论】:

      【解决方案5】:

      对 Nathan Dunn 的回答的补充说明:要添加声音,请使用以下 JSON 消息

      {
      "GCM": "{ \"notification\": { \"text\": \"test message\",\"sound\":\"default\" } }"
      }
      

      【讨论】:

      • 如何在有效载荷中发送图像 URL
      【解决方案6】:

      我花了一段时间才弄清楚如何使用正确的有效负载发送通知(发布到主题)。所以我把它放在这里。

      private void PublishToTopic(string topicArn)
      {
          AmazonSimpleNotificationServiceClient snsClient = 
                 new AmazonSimpleNotificationServiceClient(Amazon.RegionEndpoint.EUWest1);
          PublishRequest publishRequest = new PublishRequest();
          publishRequest.TopicArn = topicArn;
          publishRequest.MessageStructure = "json";
          string payload = "\\\"data\\\":{\\\"text\\\":\\\"Test \\\"}";
          publishRequest.Message = "{\"default\": \"default\",\"GCM\":\"{" + payload + "}\"}";
          PublishResponse publishResult = snsClient.Publish(publishRequest);
      }    
      

      【讨论】:

        【解决方案7】:

        亚马逊确实支持 FCM,因为之前的所有代码都已从 GCM 迁移到 FCM。下面的文章详细解释。

        Article Published by Amazon

        【讨论】:

          【解决方案8】:

          回答问题:

          1. AWS SNS 确实支持 FCM。
          2. 没有 AWS 在发送推送通知后不存储消息。

          有关使用 SNS 设置 FCM 的详细教程,请阅读this article.

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多