Android 带AWS SNS的FCM

Android 带AWS SNS的FCM,android,amazon-web-services,google-cloud-messaging,amazon-sns,firebase-cloud-messaging,Android,Amazon Web Services,Google Cloud Messaging,Amazon Sns,Firebase Cloud Messaging,我正在为我的android项目使用AWS资源,我计划在AWS SNS中为我的项目添加推送通知服务。很少有问题困扰我。我没有发现任何关于这些的问题,除了一两个问题,但解释不清楚 1.AWS是否支持FCMSNS使用GCM。但谷歌建议使用FCM而不是GCM。我没有找到支持FCM的AWS 2.AWS是否在发送推送通知后将消息(或数据)存储到其数据库中 3.我尝试将FCM api密钥放入SNS应用平台,它显示了无效参数为什么?FCM向后兼容GCM。在AWS上设置FCM的步骤与相同,并且(至少目前)FCM在

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

1.
AWS
是否支持
FCM
<代码>SNS使用
GCM
。但谷歌建议使用FCM而不是GCM。我没有找到支持FCM的AWS

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


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

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

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

有谷歌提供的,但你需要作出的改变主要是在应用程序方面

使用SNS在应用程序上测试GCM/FCM需要遵循以下步骤:

  • 创建一个,选择Google Cloud Messaging(GCM)作为推送通知平台,并在API键字段中提供您的
  • 选择平台应用程序并单击创建平台端点按钮
  • 提供应用程序生成的InstanceID(设备令牌)。您必须扩展
    FirebaseInstancedService
    并覆盖
    onTokenRefresh
    方法才能在Android应用程序中看到这一点。一旦你卸载并重新安装你的应用程序,你的令牌应该在第一次启动时打印到Android Studio中的调试控制台
  • 单击添加端点按钮
  • 单击平台应用程序的ARN链接
  • 为设备选择新创建的端点,然后单击发布到端点按钮
  • 选择JSON消息格式,然后单击JSON消息生成器按钮
  • 输入测试消息并单击生成JSON按钮
  • 现在是“抓住你了”部分
  • SNS生成的消息将采用以下形式:

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

    {
    "GCM": "{ \"notification\": { \"title\": \"test title\", \"body\": \"test body\" } }"
    }
    
    (有关FCM消息的JSON格式的更多信息,请参阅。)

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


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

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

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

    有谷歌提供的,但你需要作出的改变主要是在应用程序方面

    使用SNS在应用程序上测试GCM/FCM需要遵循以下步骤:

  • 创建一个,选择Google Cloud Messaging(GCM)作为推送通知平台,并在API键字段中提供您的
  • 选择平台应用程序并单击创建平台端点按钮
  • 提供应用程序生成的InstanceID(设备令牌)。您必须扩展
    FirebaseInstancedService
    并覆盖
    onTokenRefresh
    方法才能在Android应用程序中看到这一点。一旦你卸载并重新安装你的应用程序,你的令牌应该在第一次启动时打印到Android Studio中的调试控制台
  • 单击添加端点按钮
  • 单击平台应用程序的ARN链接
  • 为设备选择新创建的端点,然后单击发布到端点按钮
  • 选择JSON消息格式,然后单击JSON消息生成器按钮
  • 输入测试消息并单击生成JSON按钮
  • 现在是“抓住你了”部分
  • SNS生成的消息将采用以下形式:

    {
    "GCM": "{ \"data\": { \"message\": \"test message\" } }"
    }
    
    正如我们前面提到的,
    数据
    有效负载将被忽略,如果没有实现接收它们的服务。我们希望在不编写太多代码的情况下进行测试,因此
    {
        "default": “any value", 
         "GCM": "{ \"notification\": { \"body\": \”message body\”, \”title\”: \”message title \”, \"sound\":\"default\" } , \"data\" : {\”key\" : \”value\", \”key2\" : \”value\” } }”
    }
    
    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);
    }