aws s3 SDK for iOS putObjectRegquest到“新”区域不工作

首先让我说我是新的ios / xcode以及AWS。

我正在创build一个将数据写入AWS S3存储桶的应用程序。 该应用程序在创build存储桶并将对象放置到美国标准区域时起作用。 但是,当我将该地区更改为新加坡时,应用程序会成功创build存储区 – 但是,我无法将对象放入存储区,AWS不会产生任何错误或exception。

这是有问题的代码。 createBucket方法中的注释代码在新加坡成功创build了一个桶。 processGrandCentralDispatchUpload方法适用于美国标准地区,但不会将对象放到我的新加坡桶中。

- (void)createBucket { // Create the bucket. @try { //S3Region *region = [[S3Region alloc] initWithStringValue:kS3RegionAPSoutheast1]; //S3CreateBucketRequest *createBucketRequest = [[S3CreateBucketRequest alloc] initWithName:[Constants S3Bucket] andRegion:region]; S3CreateBucketRequest *createBucketRequest = [[S3CreateBucketRequest alloc] initWithName:[Constants S3Bucket]]; S3CreateBucketResponse *createBucketResponse = [self.s3 createBucket:createBucketRequest]; NSLog(@"create bucket response: %@", createBucketResponse.error); if(createBucketResponse.error != nil) { NSLog(@"Error: %@", createBucketResponse.error); } } @catch (AmazonServiceException* asex) { NSLog(@"putObject - AmazonServiceException - %@", asex); } @catch (AmazonClientException* acex) { NSLog(@"putObject - AmazonClientException - %@", acex); } 

}

 - (void)processGrandCentralDispatchUpload:(NSData *)jsonData withTimestamp:(int)timestamp 

{

 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ UserData * user = [[[DataStore defaultStore] user] objectAtIndex:0]; NSString * dateKeyComponent = [self putRequestDateComponent:timestamp]; objectName = [NSString stringWithFormat:@"%@/%@/%@", user.email, user.uniqueIdentifier, dateKeyComponent]; S3PutObjectRequest *putObjectRequest = [[S3PutObjectRequest alloc] initWithKey:objectName inBucket:[Constants S3Bucket]]; putObjectRequest.contentType = @"data/json"; putObjectRequest.data = jsonData; // Put the image data into the specified s3 bucket and object. @try { S3PutObjectResponse *putObjectResponse = [self.s3 putObject:putObjectRequest]; dispatch_async(dispatch_get_main_queue(), ^{ if(putObjectResponse.error != nil) { NSLog(@"Error: %@", putObjectResponse.error); [self showAlertMessage:[putObjectResponse.error.userInfo objectForKey:@"message"] withTitle:@"Upload Error"]; } else { //[self showAlertMessage:@"The data was successfully uploaded." withTitle:@"Upload Completed"]; } [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; }); } @catch (AmazonServiceException* asex) { NSLog(@"putObject - AmazonServiceException - %@", asex); } @catch (AmazonClientException* acex) { NSLog(@"putObject - AmazonClientException - %@", acex); } }); 

}

我是适用于iOS的AWS开发工具包的维护人员之一。 对不起,你遇到困难。

如果您的存储桶名称包含非字母数字字符,则可能需要将Amazon S3客户端的端点设置为存储桶的区域。

 AmazonS3Client *s3 = [[AmazonS3Client alloc] initWithCredentialsProvider:provider]; s3.endpoint = [AmazonEndpoints s3Endpoint:AP_SOUTHEAST_1]; 

您也可以打开应用程序中的详细日志logging,以查看使用SDK时服务的原始响应。 如果您确实看到未被捕获的错误,请告诉我们。

 [AmazonLogger verboseLogging]; 

有几件事我会注意到你的代码,你可能也想考虑一下:

  • 一旦桶被创build,你不再需要调用创build桶。 您可能需要考虑从应用程序中删除S3CreateBucketRequest/S3CreateBucketResponse
  • S3存储桶命名在所有地区都是唯一的。 如果存储桶是按照美国标准创build的,那么在没有首先删除美国标准存储桶的情况下,您不能在新加坡创build它。
  • 您好像在代码中混合了exception和error handling。 请参阅我们的博客文章 ,了解如何控制SDK中的exception处理。