AmazonSimpleNotificationServiceClient - 如何使用 TargetArn 发布请求,其中包含没有“默认”值的自定义有效负载?

分享于2022年10月08日 amazon-sns c# push-notification 问答
【问题标题】:AmazonSimpleNotificationServiceClient - How to PublishRequest with TargetArn that contains Custom Payload without "default" value?AmazonSimpleNotificationServiceClient - 如何使用 TargetArn 发布请求,其中包含没有“默认”值的自定义有效负载?
【发布时间】:2022-10-07 07:52:54
【问题描述】:

我有:

  1. 编写了一个正在运行的接收 FCM 通知的 Android 应用程序。
  2. 设置 Amazon SNS:移动:推送通知。
  3. 我可以使用 Amazon SNS 控制台通过“每个交付协议的自定义负载”发布消息。

    { \"GCM\": \"{ \"data\": { \"MyTitle\": \"Sample endpoints\", \"MyMessage\": \"Important\" } }\" }

    Amazon SNS Console - Publish Message

    1. 我正在运行的 Android 应用程序只能接收带有“数据”的消息。这是我期望收到的。

    \"{MyTitle=示例端点,MyMessage=重要}\"

    Android Studio - Message received

    1. 使用“AmazonSimpleNotificationServiceClient”[AWSSDK.SimpleNotificationService 3.7.4.3] 编写了一个 .NET 应用程序来发布请求,尝试使用与 Amazon SNS 控制台一样的方式发布消息。我能够成功发布。

    Visual studio .NET Application

    1. 我正在运行的 Android 应用程序收到消息,但该消息包含在 \"default\" 属性中。这不是预期的,我想要从 Amazon SNS 控制台收到的相同消息。

    {default={\"GCM\": \"{ \"data\": {\"MyTitle\": \"Sample endpoints\", \"MyMessgae\" : \"Criticald\" } } \" }}

    Android Studio - Message received

    1. 我尝试将 PublishRequest.MessageSturcture 用于 \"json\"(这需要 \"default\" 属性才能发布)。我删除了它,消息自动用 \"default\" 包装。
    2. 如何从 .NET 应用程序发送自定义原始消息,就像从 Amazon SNS 控制台发送“每个交付协议的自定义负载”一样?我想发布到“平台端点 ARN”。

【解决方案1】:

从 AWS 控制台发送消息不同于使用 AmazonSimpleNotificationServiceClient 发送消息。

您将需要构造“PublishRequest”对象。

  • 设置“MessageStructure = json”
  • 使用 TargetArn / TopicArn。
  • 消息 = 需要采用特定格式。必须有带有虚拟数据的“默认”成员后跟“GCM”或“APNS”......“GCM”的内容是字符串而不是子节点。

这是一个工作代码:

        // Android Payload
        string payload = "\\\"data\\\":{\\\"MyTitle\\\":\\\"test message \\\", \\\"MyMessage\\\": \\\"Important\\\"}";

        // iOS Payload
        //string payload = "\\\"notification\\\" : {\\\"content_available\\\" : true }, \\\"data\\\": { \\\"MyTitle\\\": \\\"Sample message for iOS endpoints\\\", \\\"MyMessage\\\":\\\"Hello world\\\",\\\"Payload\\\": {\\\"InstructionID\\\": \\\"f7a87860-11f4-47e1-8a39-3da2ffd6eadb\\\",\\\"IsAlert\\\": false,\\\"Content\\\": \\\"This is new content\\\",\\\"Value\\\": 2.554,\\\"Counter\\\": 290,\\\"DateTime\\\": \\\"2022-09-11T16:13:57.2009482Z\\\"}}";
        var request = new PublishRequest
        {   
            Message = "{\"default\": \"default message\",\"GCM\":\"{" + payload + "}\"}",
            TargetArn = fcmARN,
            MessageStructure = "json"
        };
        
        try
        {
            var response = await snsClient.PublishAsync(request);
            if (response.HttpStatusCode.Equals(HttpStatusCode.OK))
                Console.WriteLine("Message Sent to Topic");
            else
                Console.WriteLine("Failed - Message Sent to Topic");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }

示例消息: enter image description here

【讨论】: