ios - 带有进度 block 的 Amazon S3 iOS SDK 后台上传

标签 ios objective-c amazon-web-services amazon-s3

我正在开发一个依赖 AWS 进行文件上传和下载的应用程序。在上传的情况下,当我使用 AWSS3TransferManagerUploadRequest 上传视频文件时,我可以使用进度 block 显示进度条,但是当我按下主页按钮并且应用程序进入后台时,上传暂停(可能是因为它使用了 NSURLConnection)。仅当应用程序在前台运行时才会进行上传。

这是使用 AWSS3TransferManagerUploadRequest 上传文件的代码。

AWSS3TransferManager *transferManager = [AWSS3TransferManager defaultS3TransferManager];

AWSS3TransferManagerUploadRequest *uploadRequest = [AWSS3TransferManagerUploadRequest new];

uploadRequest.bucket = bucketName;
uploadRequest.key = appropriateKey;

uploadRequest.body = [NSURL fileURLWithPath:filePath];

uploadRequest.contentType = contentType;

uploadRequest.uploadProgress = progressBlock;


[[transferManager upload:uploadRequest] continueWithExecutor:[AWSExecutor mainThreadExecutor] withBlock:^id(AWSTask *task) {
    if (task.error)
    {
        if ([task.error.domain isEqualToString:AWSS3TransferManagerErrorDomain])
        {
            switch (task.error.code)
            {
                case AWSS3TransferManagerErrorCancelled:
                case AWSS3TransferManagerErrorPaused:
                    break;

                default:
                    failBlock(task.error.code, task.error.localizedDescription);
                    break;
            }
        }
        else
        {
            failBlock(task.error.code, task.error.localizedDescription);
        }
    }
    if (task.result)
    {
        AWSS3TransferManagerUploadOutput *uploadOutput = task.result;
        successBlock(uploadOutput);
    }
    return nil;
}];

这有效,除了在后台传输。

因此,我继续使用 AWS 的预签名 URL。以下是相同的代码。

AWSS3GetPreSignedURLRequest *getPreSignedURLRequest = [AWSS3GetPreSignedURLRequest new];
getPreSignedURLRequest.bucket = bucketName;

getPreSignedURLRequest.key = appropriateKey;
getPreSignedURLRequest.HTTPMethod = AWSHTTPMethodPUT;
getPreSignedURLRequest.expires = [NSDate dateWithTimeIntervalSinceNow:3600];


//Important: set contentType for a PUT request.
NSString *fileContentTypeStr = contentType;
getPreSignedURLRequest.contentType = fileContentTypeStr;
[[[AWSS3PreSignedURLBuilder defaultS3PreSignedURLBuilder] getPreSignedURL:getPreSignedURLRequest]
 continueWithBlock:^id(AWSTask *task) {

     if (task.error) {
         NSLog(@"Error: %@",task.error);
     } else {

         NSURL *presignedURL = task.result;
         NSLog(@"upload presignedURL is: \n%@", presignedURL);

         NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:presignedURL];
         request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
         [request setHTTPMethod:@"PUT"];
         [request setValue:fileContentTypeStr forHTTPHeaderField:@"Content-Type"];


         NSURLSession *session;
         NSURL *uploadFileUrl = [NSURL fileURLWithPath:filePath];
         NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromFile:uploadFileUrl];
         //uploadTask is an instance of NSURLSessionDownloadTask.
         //session is an instance of NSURLSession.
         [uploadTask resume];

     }

     return nil;
 }];

这样就解决了后台上传的问题。但它没有进度 block ,因此我无法跟踪进度。

我必须能够跟踪进度并从后台上传。这可能吗?或者有什么解决方法吗?

最佳答案

因此,我进行了大量挖掘并找到了答案。这可能对某人有帮助。

AWSS3TransferManager 有进度 block 来跟踪进度,但不支持后台传输。 AWSS3GetPreSignedURLRequest 支持后台传输,但无法跟踪进度。

他们有另一项服务,您可以通过该服务跟踪进度并在后台上传/下载。使用 AWSS3TransferUtility,您可以完成这两件事。请注意,这仍处于测试阶段。

有关更多信息,请参阅文档 - http://docs.aws.amazon.com/mobile/sdkforios/developerguide/s3transferutility.html

我在这方面遇到了很多麻烦(部分原因是我的无知)。我希望这对遇到类似问题的任何人都有用。

关于ios - 带有进度 block 的 Amazon S3 iOS SDK 后台上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34810979/

相关文章:

ios - Facebook sdk 3.5.1 邀请好友请求在 ios 中进行双重选择

ios - 没有从 didSelectRowAtIndexPath splitviewController 调用 ViewDidLoad

ios - 当 iOS 应用程序处于后台时,解析查询不返回,由后台获取触发

amazon-web-services - 禁用 AWS Elastic Beanstalk 上的 Phusion Passenger (Standalone) 错误页面?

ios - [__NSArrayM objectAtIndex:]:索引2超出范围[0 .. 0],并且是填充UITableView的正确方法

ios - iOS 11/Xcode 9.0 中的 SFSafariViewController 空白

ios - 创建具有删除功能的自定义 UIButton 类

objective-c - 有人可以向我解释这里发生了什么吗?

amazon-web-services - 使用 AWS CLI lambda 调用时,是否可以传递环境变量?

amazon-web-services - Route 53 A 记录需要多长时间更新?