如何将sns发布到特定的端点?

我有一个问题,发布SNS到一个特定的端点。
我的代码:

var AWS = require('aws-sdk'); AWS.config.loadFromPath('/web/config.json'); var sns = new AWS.SNS(); sns.publish({ // TopicArn:'arn:aws:sns:us-west-2:302467918846:MyTestTopik', TargetArn:'arn:aws:sns:us-west-2:302467918846:MyTestTopik:613ee49c-d4dc-4354-a7e6-c1d9d8277c56', Message:"Success!!! ", Subject: "TestSNS"}, function(err,data){ if (err){ console.log("Error sending a message "+err); }else{ console.log("Sent message: "+data.MessageId); } }); 

当我使用TopicArn时,一切都很好。 但是,当我尝试发送通知到特定的端点时,我会收到错误: 发送消息时出错InvalidParameter:无效的参数:主题名称
我不知道这是什么样的参数,从哪里。

类似的东西对我来说工作得很好。 我能够发布到特定的端点使用:苹果推送通知服务沙箱(APNS_SANDBOX)

你也可以尝试更新aws-sdk,当前版本是1.9.0。

这是我的代码,TargetArn直接从SNS控制台复制。 我省略了一些数据,

 var sns = new AWS.SNS(); var params = { TargetArn:'arn:aws:sns:us-west-2:302467918846:endpoint/APNS_SANDBOX/<APP_NAME>/<USER_TOKEN>' Message:'Success!!! ', Subject: 'TestSNS' }; sns.publish(params, function(err,data){ if (err) { console.log('Error sending a message', err); } else { console.log('Sent message:', data.MessageId); } }); 

您可能有一个无效的区域。 检查您的区域的主题,并相应地设置。 例如,如果你是我们西2,你可以做类似的事情

 var sns = new aws.SNS({region:'us-west-2'}); 

如果你不按摩有效载荷,这一切都不会起作用。

  var arn = 'ENDPOINT_ARN'; console.log("endpoint arn: " + arn); var payload = { default: message_object.message, GCM: { data: { message: message_object.message } } }; // The key to the whole thing is this // payload.GCM = JSON.stringify(payload.GCM); payload = JSON.stringify(payload); // Create the params structure // var params= { TargetArn: arn, Message: payload, MessageStructure: 'json' // Super important too }; sns.publish(params , function(error, data) { if (error) { console.log("ERROR: " + error.stack); } else { console.log("data: " + JSON.stringify(data)); } context.done(null, data); }); 

所以,事实certificate,你必须指定消息结构(是JSON)。 我试图从AWS控制台发布到端点,只要我select了JSON,它就能很好地工作。 使用RAW将无济于事。

在我的脚本中,以前的post是在做:

 var params = { TargetArn: arn, Message:'Success!!! ', Subject: 'TestSNS' }; 

即使CloudWatchlogging了成功,我也从未收到过这个消息。 只要我添加了MessageStructure数据,并且正确格式化了有效载荷,它就像一个魅力一样。

[默认]参数没有用,但是我把它留在那里以显示结构的外观。

如果您没有将有效载荷串联起来,那么SNS将会禁止并说您的消息应该包含一个“GCM”元素。

唯一令人讨厌的是你需要知道端点是什么。 我希望你不必根据terminal来格式化这个消息,这在某种程度上真的打败了SNS的目的。

你是否尝试推送诸如短信的通知? 直接寻址目前仅适用于推送通知端点。 当您尝试发布到不允许直接直接寻址的特定端点时,将会出现这种错误!

http://aws.amazon.com/sns/faqs/#Does_SNS_support_direct_addressing_for_SMS_or_Email

我和你有完全一样的问题。 问题是您正在使用的TargetArn,并没有明确的文档。 如果您尝试将应用程序ARN置于TargetArn中,则会发生错误。

这将产生错误:无效参数:TargetArn原因:> arn:aws:sns:us-west-2:561315416312351:app / APNS_SANDBOX / com.APP_NAME_HERE.app>不是有效的ARN发布到。

所有你需要做的就是把终点站安置在TargetArn中。

如果您需要查看EndpointArn,您可以:

  1. 调用listPlatformApplications()来获取所有你的应用程序的ARN。
  2. 使用App ARN调用listEndpointsByPlatformApplication()以获取EndpointArn的列表。

请享用!