使用 AWS SNS 的 FCM

FCM with AWS SNS

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

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

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

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

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

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

GCM-FCM migration instructions 由 Google 提供,但您需要进行的更改主要在 App 端。

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

  1. API 键 字段中创建一个 Platform Application in SNS, selecting Google Cloud Messaging (GCM) as the Push Notification Platform, and providing your Server API key
  2. Select 平台应用程序并单击 创建平台端点 按钮。
  3. 提供您的应用生成的 InstanceID(设备令牌)。您必须扩展 FirebaseInstanceIDService 并覆盖 onTokenRefresh 方法才能在您的 Android 应用程序中看到它。一旦你 have done this,卸载并重新安装你的应用程序,你的令牌应该会在第一次启动时打印到 Android Studio 中的调试控制台。
  4. 单击添加端点按钮。
  5. 单击平台应用程序的 ARN link。
  6. Select 为您的设备新创建的端点,然后单击 发布到端点 按钮。
  7. Select JSON 消息格式,然后单击JSON消息生成器按钮.
  8. 输入测试消息并单击 生成 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 负载,因此您需要牢记这一点并生成适当的负载到您的用例。

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

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

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

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

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

图片供参考:

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

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

对 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)
    {
    }
}

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

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);
}    

回答问题:

  1. A​​WS SNS 支持 FCM。
  2. 否 AWS 在发送推送通知后不存储消息。

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

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

Article Published by Amazon