使用AWS SNS的FCM

时间:2016-07-11 06:30:28

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

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

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

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

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

8 个答案:

答案 0 :(得分:168)

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

但是,如果您要向Android设备发送data个有效负载,除非您实施扩展FirebaseMessagingService的{​​{3}},否则不会对其进行处理。 AWS控制台中的默认JSON消息生成器发送data消息,除非实现上述服务,否则应用程序将忽略这些消息。要解决此问题以进行初始测试,您可以提供自定义notification有效负载,您的设备将会收到该有效负载(只要您的应用不在前台)

Google提供了client side service,但您需要进行的更改主要是在应用端。

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

  1. 创建GCM-FCM migration instructions,选择Google云消息传递(GCM)作为推送通知平台,并在 API密钥中提供您的Platform Application in SNS字段。
  2. 选择平台应用程序,然后单击创建平台端点按钮。
  3. 提供应用生成的InstanceID(设备令牌)。您必须扩展FirebaseInstanceIDService并覆盖onTokenRefresh方法才能在Android应用中查看此内容。在您Server API key之后,卸载并重新安装您的应用,并且您的令牌应在首次启动时打印到Android Studio中的调试控制台。
  4. 点击添加端点按钮。
  5. 单击适用于您的平台应用程序的ARN链接。
  6. 为您的设备选择新创建的端点,然后点击发布到端点按钮。
  7. 选择JSON 邮件格式,然后点击 JSON邮件生成器按钮。
  8. 输入测试消息,然后单击生成JSON 按钮
  9. 现在来了"陷阱部分"。
  10. SNS生成的消息将采用以下形式:

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

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

    {
    "GCM": "{ \"notification\": { \"text\": \"test message\" } }"
    }
    

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

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

答案 1 :(得分:13)

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

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

SNS将接受这两个版本,但其菜单选项仍在GCM

下进行分类

以下图片供您参考:

enter image description here

请注意,您可能会意外地"删除您的服务器密钥,但旧的服务器密钥不可删除。此外,如果单击添加服务器密钥按钮,您将获得第一个下面的新服务器密钥,没有警告! ...好工作谷歌;)

答案 2 :(得分:5)

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

答案 3 :(得分:4)

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

答案 4 :(得分:2)

对Nathan Dunn的答案另外说明:添加声音使用以下JSON消息

SigningCertURL

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

回答问题:

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

有关通过SNS求助设置FCM的详细教程,请阅读this article.

答案 7 :(得分:0)

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

Article Published by Amazon