我最近尝试学习如何使用Amazon AWS iOS SDK,因为我想在服务器上放一些文件,允许app用户下载。
我已下载亚马逊提供的samples并对其进行了研究: https://github.com/awslabs/aws-sdk-ios-samples/tree/master/S3TransferManager-Sample/Objective-C
将文件上传到我的S3存储桶,直到我尝试从存储桶中下载图像时,事情进展顺利。
我追踪了这些代码,发现了问题发生的地方。
[[transferManager download:self.downloadRequest1] continueWithExecutor:[BFExecutor mainThreadExecutor] withBlock:^id(BFTask *task) {
if (task.error != nil){
if(task.error.code != AWSS3TransferManagerErrorCancelled && task.error.code != AWSS3TransferManagerErrorPaused){
NSLog(@"%s Error: [%@]",__PRETTY_FUNCTION__, task.error);
self.downloadStatusLabel.text = StatusLabelFailed;
}
} else {
self.downloadRequest1 = nil;
downloadCount++;
if(3 == downloadCount){
self.downloadStatusLabel.text = StatusLabelCompleted;
}
}
return nil;
}];
我打印了task.error.code的值,发现它是1
(AWSS3TransferManagerErrorCancelled
)。
由于AWSS3TransferManagerErrorCancelled
没有异常处理,程序不会显示错误消息,也无法下载文件。
我试图找到AWSS3TransferManagerErrorCancelled
的意思,但没有运气。
有谁知道为什么错误代码= 1
(AWSS3TransferManagerErrorCancelled
)以及如何解决?我相信我必须错过一些非常简单的东西,因为这是亚马逊提供的教程。
答案 0 :(得分:1)
经过一些研究,最后我发现它是权限问题。
因此,当我创建身份池时,系统会询问您是否要启用对未经身份验证的身份的访问权限。 如果您启用此选项,AWS将为您提供默认的未经身份验证的身份,后缀为Unauth_DefaultRole。 事情是AWS不会自动授予" Get"这个身份。 您仍然需要将此Action添加到xxxUnauth_DefaultRole的策略中。
因此,这是我修改后的策略,允许未经身份验证的用户从我的存储桶中下载文件。
{
"Version": "2012-10-17",
"Statement": [{
"Action": [
"mobileanalytics:PutEvents",
"cognito-sync:*",
"s3:ListBucket",
"s3:Get*"
],
"Effect": "Allow",
"Resource": [
"*"
]
}]
}
希望这可以帮助那些也是AWS新手的人。