我正在尝试将AWS SNS用于我的应用的推送通知。我已成功使用用户信息和注册ID设置了各个终端ARN的注册。
我可以通过控制台发送个人消息,但我似乎无法弄清楚如何以编程方式发送它(JAVA)
控制台方式:(工作)
http://docs.aws.amazon.com/sns/latest/dg/mobile-push-send-directmobile.html
通过JAVA尝试的方式:
private void publishToSNSEndpoint(String username) {
// Find an entry of a users SNS registration and Endpoint ARN
SNSPush pushConfig = snsPushService.findByUsername(username);
//Get ARN to String
String endpointARN = pushConfig.getSNSEnpointARN();
//Generate SNS Push to user
String message = "{\"title\":\"Test_Title\",\"description\":\"Test_Description\"}";
PublishRequest publishRequest = new PublishRequest();
publishRequest.setMessage(message);
publishRequest.setTargetArn(endpointARN);
PublishResult publish = client.publish(publishRequest);
//print MessageId of message published to SNS topic
System.out.println("MessageId - " + publish.getMessageId());
}
目前产生以下错误:
使用EndpointARN(确认有效)参数无效: TargetArn原因:找不到指定目标arn的端点 (服务:AmazonSNS;状态代码:400;错误代码:InvalidParameter;
使用SNS应用程序ARN(三重检查这是有效的)
参数无效:TargetArn原因: arn:aws:sns:ap-southeast-xxxxxxxxx-xxxx无效发布到 (服务:AmazonSNS;状态代码:400;错误代码:InvalidParameter;
有一些文档here。但它似乎很旧了,不再适用了。
我的问题是:如何使用Java和AWS SDK以编程方式将推送通知发送到AWS SNS中的单个EndpointARN。
答案 0 :(得分:0)
我刚刚为遇到同样问题的人解决过这个问题。
消息格式化是一场噩梦,每个平台都有所不同。
我不得不加上这个。
publishRequest.setMessageStructure("json");
这适用于GCM - Android
String gcmMessage = "{ \"GCM\": \"{ \\\"data\\\": { \\\"message\\\": \\\"Hi, AWS. Sort out your JSON parsing.\\\" } }\" }";
答案 1 :(得分:0)
您还需要设置您的区域。 请注意,好像您正在使用其他一些AWS服务一样,它们可能具有不同的区域。因此,即使您全局拥有SNS,我也建议为其指定区域。
例如我的EC2实例区域与我的SNS区域不同,并且我根据针对EC2的配置推送通知。
答案 2 :(得分:0)
如果您正在使用CLI并遇到此错误,请确保您的区域和消息正确。
aws sns publish \
--target-arn "arn:aws:sns:us-east-1:xxxxxxxxx:endpoint/GCM/my_sns_application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
--message-structure "json" \
--message '{"GCM":"{\"notification\":{\"title\":\"test push\",\"body\":\"test body\"}}"}' \
--region us-east-1