【问题标题】:Amazon SNS - Sending push notifications to several devicesAmazon SNS - 向多个设备发送推送通知
【发布时间】:2019-08-06 22:50:33
【问题描述】:

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

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

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

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

不过,我在发送 JSON 时收到 InvalidParameter 错误。错误详情是

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

奇怪的是,发送到单个设备(发布到端点)的相同 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();

【问题讨论】:

    标签: amazon-sns


    【解决方案1】:

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

    MessageStructure

    如果你想发送一个 每个协议的不同消息。例如,使用一个发布 操作,您可以向您的 SMS 订阅者发送一条短消息和一个 给您的电子邮件订阅者的更长消息。如果你设置MessageStructurejson,Message 参数的值必须:

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

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

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

    有效值:json

    类型:字符串

    必填:否

    【讨论】:

    • 谢谢 :) (抱歉耽搁了这么久)
    【解决方案2】:

    因此,当向主题发送 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

    【讨论】:

    • 谢谢 :) (抱歉耽搁了这么久)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多