Amazon SNS - 向多个设备发送推送通知

时间:2015-02-19 08:30:52

标签: amazon-sns

我试图一次性向多个设备发送推送通知。为此,我做了以下事情:

  • 列表项
  • 创建主题
  • 订阅我想要的所有设备
  • 向主题发布消息

我正在尝试向我的应用发送自定义JSON。内容是:

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

尽管如此,我在发送JSON时遇到InvalidParameter错误。错误细节是

  

"消息结构 - JSON消息正文中没有默认条目"

奇怪的是,发送到单个设备(发布到endpointarn)的相同JSON正在运行。

这是我的代码:

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 个答案:

答案 0 :(得分:1)

如果您将"default"设置为Message,则SNS要求MessageStructure JSON中有一个名为json的顶级属性,其中包含默认协议的字符串值。来自Publish API documentation(强调我的):

  

MessageStructure

     

如果要发送,请将MessageStructure设置为json   每个协议的不同消息。例如,使用一个发布   动作,你可以发短信给你的短信用户和一个   邮件订阅者的邮件时间更长如果设置MessageStructure   到json,Message参数的值必须为:

     
      
  • 是一个语法上有效的JSON对象;
  •   
  • 并且至少包含一个“default”的顶级JSON键,其值为字符串。
  •   
     

您可以定义其他顶级键,用于定义要发送到特定传输协议的消息(例如“http”)。

     

有关为每个协议发送不同消息的信息   使用AWS管理控制台,转到Amazon Simple Notification Service Getting中的Create Different Messages for Each Protocol   入门指南。

     

有效值:json

     

类型:字符串

     

必填:否

答案 1 :(得分:0)

因此,在向主题发送SNS通知时,无法保证所有订阅者都使用APNS消息服务。 因此,SNS要求您还要包含默认' JSON中的字段传递给它。此默认字段将用于不属于APNS消息传递服务的每个其他订户。

因此,在这种情况下,您需要添加另一个JSON元素,以便在有非APNS订阅者时可以使用默认消息。

{ "默认":"在此处输入默认消息", " APNS_SANDBOX":" {\" aps \":\" {\\" u \\":\\&# 34; 1 \\"} \"}" }

在此页面底部可以找到更多示例: http://docs.aws.amazon.com/sns/latest/dg/mobile-push-send-custommessage.html