5

我正在處理的項目需要上傳視頻。上傳視頻的post API調用需要多部分機構。我試圖使用的代碼包含在問題的底部。AFNetworking V 2是否支持非流式多部分後臺上傳任務?

該代碼完美適用於[NSURLSessionConfiguration defaultSessionConfiguration]

如果我將配置更改爲[NSURLSessionConfiguration backgroundSessionConfiguration:@"Test Id"],代碼崩潰是因爲後臺會話僅支持文件上載。錯誤是:

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Upload tasks in background sessions must be from a file'

所有這些可在以下方法中使用使用AFMultipartBodyStream類多部分追加方法。這個類傳輸上傳,所以它不能用於後臺會話,因爲流不是文件。

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] 
         multipartFormRequestWithMethod:@"POST" 
         parameters:params 
         constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
          NSError *error = nil; 
          [formData appendPartWithFileURL:fileURL 
                 name:@"uploadFile" 
                fileName:[fileURL lastPathComponent] 
                mimeType:@"video/quicktime" 
                 error:&error]; 
         } error:&error]; 

是否有可能有一個NSURLSessionUploadTask與多部主體,可以在使用backgroundSessionConfiguration一個AFHTTPSessionManager運行?

見下面的示例代碼:

NSURL *APIURL = [NSURL URLWithString:@"https://www.test.com/uploadVideo"]; 

NSError *error = nil; 

NSDictionary *params = @{ @"token" : @"d5bcf6c2-99ec-4de7-bd87-71918b633b3a", 
          @"title" : @"Test_Video" }; 

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] 
         multipartFormRequestWithMethod:@"POST" 
         parameters:params 
         constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
          NSError *error = nil; 
          [formData appendPartWithFileURL:fileURL 
                 name:@"uploadFile" 
                fileName:filePath 
                mimeType:@"video/quicktime" 
                 error:&error]; 
         } error:&error]; 

[request addValue:@"Basic 123456789" forHTTPHeaderField:@"Authorization"]; 

NSLog(@"%@", error); 

__weak __typeof(self)weakSelf = self; 
__block NSURLSessionUploadTask *task = 
[super 
uploadTaskWithStreamedRequest:request 
progress:progress 
completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { 
    [weakSelf handleCompletionForTask:task 
         responseObject:responseObject 
           error:error 
           success:successBlock 
           failure:failureBlock]; 
}]; 

[task setTaskDescription:endpoint.name]; 
[task resume]; 

回答

6

有背景NSURLSessions一些嚴格的限制,無論AFNetworking的。上傳任務必須使用[NSURLSession uploadTaskWithRequest:fromFile:]我使用Charles來監視來自此方法的傳出HTTP請求,並注意到它正在使用application/octet-stream。沒有辦法解決這個問題,至少在過去的幾天裏我都沒有找到修補它的方法。

+1

我也面臨同樣的問題,但問題是沒有上傳任務必須使用的文檔[NSURLSession uploadTaskWithRequest:fromFile:]。在iOS7中,我們在使用uploadTaskWithStreamedRequest時遇到異常:使用後臺配置,但在iOS8上沒有異常,並且當應用處於前臺時一切正常,但一旦它進入後臺,NSStreamEventEndEncountered被調用。如果你知道的話,請向我推薦任何有關這件事的文檔。 –

+0

我發現這是經驗性的,但請參閱[後臺傳輸注意事項](https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html#//apple_ref/doc/uid/TP40013509-SW44),特別是「僅支持上載和下載任務(無數據任務)」。並從一個相關的(SO回答)(http://stackoverflow.com/questions/19985353/nsurlsession-uploading-assets-with-background-transfer)「與Tech Talks事件的蘋果工程師談話,他證實背景NSURLSession只支持文件網址「。 – JVillella