FCM与AWS SNS的结合

106

我正在使用AWS资源进行我的安卓项目,我计划使用AWS SNS为我的项目添加推送通知服务,有几个问题让我很困扰,除了一两个解释不清的问题外,我没有找到任何相关的问题。

1. AWS支持FCM吗?SNS可以使用GCM,但谷歌建议使用FCM替代GCM。我没有发现AWS支持FCM

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

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


SNS目前还不支持FCM,它使用了一个已弃用的GCM版本。你从哪里获取API密钥? - Arthur Thompson
1
我尝试的是将FCM的API密钥放入SNS中,但它并没有起作用。在阅读AWS(SNS)文档后,他们提到要放置服务器密钥。我尝试了一下,它成功了。我可以通过SNS向FCM发送推送通知。不太清楚为什么它会有效,你确定SNS目前不支持FCM吗? - Naroju
服务器密钥是发送GCM(现在是FCM)消息所必需的,这是正确的。在客户端(移动设备)上,GCM和FCM通常是相同的,因此两者都可以按预期接收消息。但是,有一些FCM功能将无法正常工作,例如主题消息。 - Arthur Thompson
能否在 FMC 中使用 SNS 主题?感谢您提供如此棒的答案。 - Juan Jose Tugores
使用SNS的好处是什么?FCM不应该足够吗? - Khaled Osman
8个回答

209
FCM向后兼容GCM。在AWS上设置FCM的步骤与 GCM设置过程相同,并且(至少目前)FCM在服务器端配置方面与GCM和SNS透明地工作。
然而,如果您要向Android设备发送数据有效负载,则必须实现一个扩展FirebaseMessagingService客户端服务。 AWS控制台中的默认JSON消息生成器发送 data 消息,除非实现了上述服务,否则应用程序将忽略它们。为了在初始测试中解决此问题,可以提供自定义通知有效负载,该有效负载将被您的设备接收(只要您的应用程序不在前台)
Google提供了 GCM-FCM迁移说明,但需要进行的更改主要在应用程序端。
您需要遵循以下步骤,使用SNS在您的应用程序上测试GCM/FCM:

  1. 在SNS中创建一个平台应用程序,选择Google Cloud Messaging (GCM)作为推送通知平台,并在API密钥字段中提供您的服务器API密钥
  2. 选择平台应用程序,然后单击创建平台端点按钮。
  3. 提供由您的应用生成的InstanceID (设备令牌)。您必须扩展FirebaseInstanceIDService并覆盖onTokenRefresh方法以在Android应用程序中查看此内容。一旦您完成了这个步骤,请卸载并重新安装您的应用程序,您的令牌应该会在首次启动时打印到Android Studio的调试控制台上。
  4. 单击添加端点按钮。
  5. 单击您平台应用程序的ARN链接。
  6. 选择新创建的设备端点,然后单击发布到端点按钮。
  7. 选择JSON 消息格式,然后单击JSON消息生成器按钮。
  8. 输入测试消息,然后单击生成JSON按钮。
  9. 现在是"gotcha部分"。
SNS生成的消息格式如下:
{
"GCM": "{ \"data\": { \"message\": \"test message\" } }"
}

正如之前提到的,如果没有实现接收数据有效载荷的服务,那么数据有效载荷将被忽略。我们希望在不编写太多代码的情况下进行测试,因此应该发送通知有效载荷。要做到这一点,只需更改JSON消息即可:
{
"GCM": "{ \"notification\": { \"title\": \"test title\", \"body\": \"test body\" } }"
}

(有关 FCM 消息的 JSON 格式的更多信息,请参见 FCM 文档。)
完成此操作后,请确保您的应用程序未在设备上运行,并单击“发布消息”按钮。现在,您应该会在设备上看到一个通知弹出。
当然,您可以通过 Amazon SNS API 在程序中执行所有这些操作,但是所有示例似乎都使用“数据”有效负载,因此您需要记住并生成适合您用例的有效负载。

2
非常棒的答案,谢谢。值得注意的是,JSON在配置选项方面有一定的深度 - 请参见https://developers.google.com/cloud-messaging/concept-options - 尽管我尚未测试任何FCM特定功能。 - Tom
2
SNS使用GCM,因此如果您正在使用GCM客户端,则应该像往常一样运行(直到Google决定退役GCM为止)。这个问题更多地涉及AWS上的FCM支持(通过Google API方面的向后兼容性支持)。 - Nathan
我按照你的回答添加了通知字段,但在我的应用程序的FirebaseMessagingService.onMessageReceived()中,RemoteMessage.getNotification()仍然为空。有解决方案吗? - matdev
你知道我在使用 SNS 时为什么会收到两个通知吗?一个带有 Expo 徽标,另一个带有白色框徽标。 - kkesley
只是留在这里,因为我第一次错过了它:您必须将“GCM”的值编码为JSON字符串,而不是直接包含它作为对象值。因此,您将在JSON中编码JSON。 - Jorn
显示剩余5条评论

15

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

您将看到遗留的服务器密钥,即 GCM API 密钥,并且您将有生成新的服务器密钥的选项,这些是 FCM 版本。

SNS 将接受两个版本,但其菜单选项仍将其归类为 GCM。

以下是供参考的图片:

输入图片描述

请注意,您可以“意外地”删除您的服务器密钥,但遗留的服务器密钥无法删除。 此外,如果您单击添加服务器密钥按钮,则会在第一个键下方获得一个新的服务器密钥,而没有任何警告!...Google 做得很好 ;)


8

对于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

5

我曾尝试使用通知有效载荷(notification payload)而非数据(data)的解决方案,但是我并没有在移动设备上收到推送通知。我发现了这个带有英文字幕的教程https://youtu.be/iBTFLu30dSg,它详细介绍了如何逐步使用FCM与AWS SNS以及如何通过AWS控制台发送推送通知,并提供了在php中使用aws php sdk实现的示例。这对我的帮助很大。


3

关于Nathan Dunn的答案,还有一个额外的说明:如果要添加声音,请使用以下JSON消息

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

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

0

亚马逊支持 FCM,因为所有先前的代码都已从 GCM 迁移到 FCM。下面的文章详细解释了这一点。

亚马逊发布的文章


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

-3

回答问题:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接