【问题标题】:Using amazon AWS SNS service IOS使用亚马逊AWS SNS服务IOS
【发布时间】:2015-02-21 11:28:35
【问题描述】:

我正在开发一个使用 amazon aws 服务的应用程序,它是一个信使。

我想使用 IOS 推送通知服务和亚马逊 SNS 来实现 2 个用户之间的通信。我可以通过将消息发布到名为端点的目标来从 SNS 控制台发送消息。

但是,我无法通过 IOS 的亚马逊 SDK 将消息从一部手机发送到另一部手机。我可以通过亚马逊的 API 那样做吗?

我想将名为 messageDict 的 NSDictionary 发送到目标端点。我可以在不使用服务器的情况下实现这一点吗?

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;

}];

【问题讨论】:

    标签: ios amazon-web-services amazon-sns


    【解决方案1】:

    发送带有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
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      AWSSNS 实例未正确实例化。

      AWSSNS *publishCall = [AWSSNS new];
      

      需要改成

      AWSSNS *publishCall = [AWSSNS defaultSNS];
      

      不过,一般来说,我不建议从客户端设备发送推送通知,因为任何人都可以从移动设备获取临时凭据并向您的应用用户发送垃圾邮件。 Amazon SNS 目前不支持细粒度的访问控制,也不支持过多的发送请求。

      从安全角度来看,更好的解决方案是拥有一个推送通知服务器。您可以查看一些可能有帮助的服务:

      【讨论】:

        【解决方案3】:

        您可以向特定设备(端点)或主题(多个订阅者列表)发送推送通知

        两者的 API 调用略有不同。您可以使用message.topicArnmessage.targetArn,如此处 API 文档中所述 http://docs.aws.amazon.com/sns/latest/api/API_Publish.html

        (Objective-C 类文档在这里:http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/AWSSNSPublishInput.html

        您的 ARN 是 Endpoint 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; }
        

        【讨论】:

        • 我能够完成它。谢谢,我发现我在消息对象中犯了错误。谢谢
        猜你喜欢
        • 2017-03-08
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 2014-10-29
        • 1970-01-01
        • 2015-05-15
        • 2011-12-29
        • 2011-09-24
        相关资源
        最近更新 更多