亚马逊SNS - 向多个设备发送推送通知

4

我正在尝试一次性向多个设备发送推送通知。为此,我正在执行以下操作:

  • 创建一个主题
  • 将我想要的所有设备订阅到该主题
  • 向主题发布消息

我正在尝试向我的应用程序发送自定义JSON。内容如下:

{"APNS_SANDBOX":"{\"aps\":\"{\\\"u\\\":\\\"1\\\"}\"}"}

尽管如此,我在发送JSON时遇到了“InvalidParameter”错误。错误细节如下:
“消息结构 - JSON消息正文中没有默认条目”。
奇怪的是,同样的JSON发送到单个设备(发布到endpointarn)是有效的。
以下是我的代码:
AmazonSimpleNotificationServiceClient client = new AmazonSimpleNotificationServiceClient(ssAmazonToken.ssSTAmazonToken.ssAccessKey, ssAmazonToken.ssSTAmazonToken.ssSecretKey, solveRegionEndpoint(ssRegionEndpoint));

//create topic
CreateTopicRequest topicRequest = new CreateTopicRequest();
string topicName = Guid.NewGuid().ToString();
topicRequest.Name = topicName;
log(ssIsDebugMode, "Name (" + topicRequest.Name + ")", module);
CreateTopicResponse topicResponse = client.CreateTopic(topicRequest);
ssTopicArn = topicResponse.TopicArn;

//subscribe endpoints to the topic
foreach(RCAmazonSNSDeviceRecord endpoint in ssDevices) 
{
    SubscribeRequest subscribeRequest = new SubscribeRequest();
    subscribeRequest.TopicArn = topicResponse.TopicArn;
    subscribeRequest.Endpoint = endpoint.ssSTAmazonSNSDevice.ssEndpointArn;
    subscribeRequest.Protocol = "application";

    log(ssIsDebugMode, "TopicArn (" + subscribeRequest.TopicArn + ") "
                     + "Endpoint (" + subscribeRequest.Endpoint + ") "
                     + "Protocol (" + subscribeRequest.Protocol + ") ", module);

    SubscribeResponse subscribeResponse = client.Subscribe(subscribeRequest);

    /*ConfirmSubscriptionRequest confirmSubsRequest = new ConfirmSubscriptionRequest();
    confirmSubsRequest.AuthenticateOnUnsubscribe = true;
    confirmSubsRequest.TopicArn = topicResponse.TopicArn;*/
}

//publish message to the topic
PublishRequest publishRequest = new PublishRequest();
publishRequest.TopicArn = topicResponse.TopicArn;
publishRequest.MessageStructure = ssIsJSON ? "json" : "";
publishRequest.Message = ssMessageContent;

log(ssIsDebugMode, "TargetArn (" + publishRequest.TargetArn + ") "
                 + "MessageStructure (" + publishRequest.MessageStructure + ") "
                 + "Message (" + publishRequest.Message + ") ", module);


PublishResponse response = client.Publish(publishRequest);
ssAmazonResponse.ssSTAmazonResponse.ssResponseCode = response.HttpStatusCode.ToString();
ssMessageId = response.MessageId;
ssContentLength = response.ContentLength.ToString();
2个回答

2
SNS要求在JSON的Message中有一个名为"default"的顶级属性,如果您将MessageStructure设置为json,则该属性需要具有默认协议的字符串值。以下是发布API文档的说明(重点在于我):
“MessageStructure” 如果您想为每个协议发送不同的消息,请将MessageStructure设置为json。例如,使用一个发布操作,您可以向短信订阅者发送简短的消息,并向电子邮件订阅者发送较长的消息。如果将MessageStructure设置为json,则Message参数的值必须:
- 是一个语法上有效的JSON对象; - 并且包含至少一个名为"default"的顶级JSON键,其值为字符串。 您可以定义其他顶级键,以定义要发送到特定传输协议(例如“http”)的消息。
有关在AWS管理控制台中使用不同协议发送不同消息的信息,请参见Amazon Simple Notification Service入门指南中的为每个协议创建不同的消息
有效值:json 类型:字符串 是否必需:否

谢谢 :)(非常抱歉回复晚了) - user3609216

0
当向主题发送SNS通知时,不能保证所有订阅者都使用APNS消息服务。因此,SNS要求您在传递给它的JSON中还包括一个“默认”字段。对于未使用APNS消息服务的其他订阅者,将使用此默认字段。
因此,在这种情况下,您需要添加另一个JSON元素,以便在存在非APNS订阅者时有一个默认消息可用。
{ "default": "在此输入默认消息", "APNS_SANDBOX": "{\"aps\":\"{\\"u\\":\\"1\\"}\"}" }
此页面底部可以找到更多示例: http://docs.aws.amazon.com/sns/latest/dg/mobile-push-send-custommessage.html

谢谢 :) (抱歉回复迟了) - user3609216

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