我正在开发一个使用amazon aws服务的应用程序,它是一个信使。
我想使用IOS推送通知服务和亚马逊SNS来实现2个用户之间的通信。我可以通过向名为endpoint的目的地发布消息来从SNS控制台发送消息。
但是,我无法通过IOS的amazon SDK从一个手机向另一个手机发送消息。我可以通过亚马逊的API以这种方式做到吗?
我想将名为messageDict的NSDictionary发送到目标endPoint。我可以不使用服务器实现这一目标吗?
NSDictionary *messageDict = [[NSDictionary alloc]init];
messageDict = @{ @"Name" : @"HelloWrold" ,@"Id" :@"GoodBye",};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:messageDict options:NSJSONWritingPrettyPrinted error:nil];
NSString *jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"Jsonstring %@",jsonString);
AWSSNS *publishCall = [AWSSNS new];
AWSSNSPublishInput *message = [AWSSNSPublishInput new];
message.subject = @"My First Message";
//This is the ending point
message.topicArn = @"arn:aws:sns:us-east-1:012345678912:endpoint/APNS_SANDBOX/appTesting/201sjad-XXXX-XXXX-XXXX-c34sdfdsf1d9c";
message.messageAttributes = messageDict;
message.messageStructure = jsonString;
[[publishCall publish:message]continueWithExecutor:[BFExecutor mainThreadExecutor] withBlock:^id(BFTask *task){
if (task.error != nil) {
NSLog(@"Error %@",task.error);
}
else{
NSLog(@"Successful");
}
return nil;
}];
答案 0 :(得分:5)
使用SNS
发送APN最困难的事情是使数据结构正确。以下是使用swift发布主题的方法。每个平台都需要是一个编码的字符串,如果你搞砸了,SNS只会传递你的默认信息。
func publishPush() {
let sns = AWSSNS.defaultSNS()
let request = AWSSNSPublishInput()
request.messageStructure = "json"
var aps: NSMutableDictionary = NSMutableDictionary()
var dict = ["default": "The default message", "APNS_SANDBOX": "{\"aps\":{\"alert\": \"YOUR_MESSAGE\",\"sound\":\"default\", \"badge\":\"1\"} }"]
let jsonData = NSJSONSerialization.dataWithJSONObject(dict, options: nil, error: nil)
request.message = NSString(data: jsonData!, encoding: NSUTF8StringEncoding) as! String
request.targetArn = "blahblahblah:MyTopic"
sns.publish(request).continueWithBlock { (task) -> AnyObject! in
println("error \(task.error), result:; \(task.result)")
return nil
}
}
答案 1 :(得分:3)
您可以向特定设备(端点)或主题(多个订阅者列表)发送推送通知
两者的API调用略有不同。您可以使用此处的API文档中描述的message.topicArn
或message.targetArn
http://docs.aws.amazon.com/sns/latest/api/API_Publish.html
(Objective-C类文档在这里:http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/AWSSNSPublishInput.html)
您的ARN是端点ARN,您的代码会将其分配给message.topicArn
我会把它改成
message.targetArn = @"arn:aws:sns:us-east-1:123456789012:endpoint/APNS_SANDBOX/appTesting/201sjad-XXXX-XXXXXX-XXXX-c34sdfdsf1d9c";
(ARN编辑以模糊您的帐户ID)
此外,请阅读并应用http://mobile.awsblog.com/post/Tx223MJB0XKV9RU/Mobile-token-management-with-Amazon-SNS的最佳做法来获取和管理您的设备令牌。
以下是Javascript中的代码示例,您可以轻松地适应Objective-C。
var DEFAULT_SNS_REGION = 'eu-west-1';
var SNS_ENDPOINT_ARN = 'arn:aws:sns:eu-west-1:0123456789012:endpoint/APNS_SANDBOX/AmazonSNSPushDemo/95084b8f-XXXX-XXXX-XXXX-b3429d0fa528';
var SNS_TOPIC_ARN = 'arn:aws:sns:eu-west-1:012345678912:PushNotifications';
function sendNotification(msg, topicARN, endPointARN) {
var sns = new aws.SNS({
apiVersion: '2010-03-31',
region: DEFAULT_SNS_REGION
});
var params = {}
if (topicARN != '') {
params = {
Message: msg,
//MessageStructure: 'json',
TopicArn: topicARN
};
} else {
params = {
Message: msg,
//MessageStructure: 'json',
TargetArn: endPointARN
};
}
console.log(params);
var deferred = Q.defer();
sns.publish(params, function(err,data) {
if (err) {
console.log(err, err.stack); // an error occurred
deferred.reject(err);
} else {
console.log(data); // successful response
deferred.resolve(data);
}
});
return deferred.promise; }
答案 2 :(得分:0)
AWSSNS
实例未正确实例化。
AWSSNS *publishCall = [AWSSNS new];
需要更改为
AWSSNS *publishCall = [AWSSNS defaultSNS];
但是,一般情况下,我不建议从客户端设备发送推送通知,因为任何人都可以从移动设备获取临时凭据并向您的应用用户发送垃圾邮件。 Amazon SNS目前不支持细粒度访问控制,也不支持过多的发送请求。
从安全角度来看,更好的解决方案是拥有推送通知服务器。您可以查看一些可能有用的服务: