带有AWS SNS的FCM


94

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

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

2. AWS即使在发送推送通知之后,是否也将消息(或数据)存储到其数据库中?

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


SNS尚不支持FCM,它使用了已弃用的GCM版本。您从哪里获得API密钥?
亚瑟·汤普森

1
我试过的是,我试图将FCM的api密钥放入SNS中,但它不起作用,在阅读了AWS(SNS)中的文档后,他们提到要放入服务器密钥。我试过了,效果很好。我能够通过SNS为FCM发送推送通知。不知道它为什么起作用的确切原因。您确定SNS当前不支持FCM吗?
Naroju

正确要求服务器密钥才能发送GCM(现在为FCM)消息。在客户端(移动设备)上,GCM和FCM通常相同,因此它们都将以预期的方式接收消息。但是,有些FCM功能将无法使用,例如:主题消息传递。
亚瑟·汤普森

是否可以在fmc中使用sns主题?感谢您提供如此
出色的

首先使用SNS有什么好处?FCM还不够吗?
哈立德·奥斯曼

Answers:


188

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

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

GCM-FCM迁移说明由谷歌提供的,但是你需要做的改变主要是在应用程序方面。

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

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

SNS生成的消息将具有以下形式:

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

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

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

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

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


2
出色的回答,谢谢。值得注意的是,json在配置选项方面有一定深度-请参阅developers.google.com/cloud-messaging/concept-options-尽管我尚未测试任何FCM特定功能。
汤姆

data即使客户端应用未实现FCM而是GCM,也可以使用sns正常运行邮件。在我的应用程序中,我尚未在客户端升级到FCM,但是使用SNS的FCM也可以很好地处理data消息。不行吗
Sash_KP

2
SNS使用GCM,因此,如果您使用的是GCM客户端,则其行为应正常(直到Google决定退出GCM为止)。这个问题更多与AWS上的FCM支持有关(通过Google API方面的向后兼容性来支持)
Nathan Dunn

是否可以在fmc中使用sns主题?感谢您提供如此
出色的

欢迎使用-是的,您可以像往常一样为SNS主题单独订阅移动推送(即GCM-> FCM)端点,但是这会在AWS内生成大量消息。如果您使用的是FCM客户端,另一种选择是使用仅通过Google服务器传播的FCM主题或用户细分
Nathan Dunn

14

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

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

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

这是图片供您参考:

在此处输入图片说明

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


5

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


5

内森·邓恩(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令牌在哪里?
JPM

如何在有效负载中发送图像URL
tarek noaman

3

内森·邓恩(Nathan Dunn)的答案仅是一个补充说明:要添加声音,请使用以下JSON消息

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

如何在有效负载中发送图像URL
tarek noaman

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


0

回答问题:

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

有关使用SNS设置FCM的详细教程,请阅读本文。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.