2016-01-15 44 views
3

我正在研究一個依靠AWS進行文件上傳和下載的應用程序。在上傳的情況下,當我使用AWSS3TransferManagerUploadRequest上傳視頻文件時,我可以使用進度塊顯示進度條,但是當我按Home按鈕並且應用程序進入後臺時,上傳暫停(可能是因爲它使用NSURLConnection)。只有當應用程序在前臺運行時纔會上載。Amazon S3 iOS SDK使用進度塊上傳背景

這是使用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; 
}]; 

這解決了在後臺上傳的問題。但它沒有進展模塊,因此我無法追蹤進展。

我必須能夠跟蹤進度並從後臺上傳。這可能嗎?或者有任何解決方法?

+0

您是否找到過預先簽名,上傳和跟蹤進度的方法? – Eusthace

+0

@Eusthace檢查我的答案..我做到了。他們提供TransferUtility。它仍處於測試階段,但按要求工作。 – Skywalker

回答

1

因此,我做了很多挖掘並找到了答案。這可能對某人有幫助。

AWSS3TransferManager具有進度模塊來跟蹤進度,但不支持後臺傳送。而AWSS3GetPreSignedURLRequest支持後臺傳輸,但無法跟蹤進度。

他們有另一項服務,通過它你可以在後臺跟蹤進度和上傳/下載。使用AWSS3TransferUtility,你可以做這兩件事。請注意,這仍處於測試階段。

請參考文檔的更多信息 - http://docs.aws.amazon.com/mobile/sdkforios/developerguide/s3transferutility.html

我有很多的麻煩,這(部分原因是由於我的無知)。我希望這對任何有類似問題的人都有用。

+2

Yup有同樣的問題。花了很多時間實施TransferManager才發現它對我的情況沒用。更讓人討厭的是,TransferManager使得它非常容易與桌面視圖和多個上傳集成。 TransferUtility沒有。在我看來,AWS SDK一直非常不直觀。 –

+0

我正在使用AWSS3TransferUtility上傳文件。上傳在後臺工作,但上傳過程中網絡丟失爲零。在我的情況下,它應該獲得網絡可達性恢復。這可能嗎? – Ada

+0

@Ada我不認爲傳輸實用程序支持並行上傳,如果您不支持並行上傳,爲什麼不製作AWSS3TransferUtilityUploadTask的單個對象並在其上調用繼續。如果這不起作用,那麼它可能無法通過網絡恢復恢復。請參閱http://docs.aws.amazon.com/mobile/sdkforios/developerguide/s3transferutility.html – Skywalker

0

對不起,但從根本上不支持使用核心iOS後臺上傳功能。

通過設計,NSURLSession後臺上傳將採用100個並行塊,並且通常只返回成功/失敗的原子響應。應用程序的實際進度是不透明的。

你無法真正解決這個問題,系列化程度越高,觸發「下一部分」上傳的次數越多,這將很快導致限制速度方面的憤怒。

背景上傳專門設計爲最小的觸摸,以節省電池和3G數據的使用。它不是爲任何交互設計的。

我想知道,考慮到需要使用後臺上傳,可能對大型資產來說,實際需要顯示用戶進度可能非常慢?沒有足夠的成功/失敗嗎?

也許爲了解決這個問題,你可以在絕對必要的情況下在前臺運行上傳,那麼你將得到反饋,如果用戶厭倦了等待或電話睡眠,那麼在應用程序拆卸回撥時,切換到由於用戶不再有興趣觀看進度條,因此在後臺任務上恢復?