5

Projekt, nad którym pracuję, musi przesłać film. Wywołanie funkcji API post do przesłania wideo wymaga treści wieloczęściowej. Kod, którego próbowałem użyć, znajduje się na dole pytania.Czy AFNetworking V 2 obsługuje inne niż przesyłanie strumieniowe zadania ładowania w tle?

Kod działa idealnie dla [NSURLSessionConfiguration defaultSessionConfiguration].

Jeśli zmienię konfigurację na [NSURLSessionConfiguration backgroundSessionConfiguration:@"Test Id"], kod ulega awarii, ponieważ sesje w tle obsługują tylko przesyłanie plików. Błąd jest:

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

Wszystkie wieloczęściowych metod dopisane które mogą być używane w następujący sposób użyć klasy AFMultipartBodyStream. Ta klasa przesyła strumieniowo przesyłanie, więc nie może być używana w sesji w tle, ponieważ strumień nie jest plikiem.

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]; 

Czy to możliwe, aby mieć NSURLSessionUploadTask z wielu części ciała, które można uruchomić w AFHTTPSessionManager który jest przy użyciu backgroundSessionConfiguration?

Zobacz przykładowy kod poniżej:

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]; 

Odpowiedz

6

Istnieją pewne ścisłe ograniczenia w NSURLSessions tle, niezależnie od AFNetworking. Załadowane zadania muszą używać [NSURLSession uploadTaskWithRequest:fromFile:], a ja użyłem Charles do monitorowania wychodzących żądań HTTP z tej metody i zauważyłem, że używa on strumienia aplikacji/oktetu. Nie da się tego obejść, a przynajmniej nic z tego nie wymyśliłem w ciągu ostatnich kilku dni.

+1

Mam również do czynienia z tym samym problemem, ale problemem jest to, że nie ma dokumentacji, które zadania przesyłania muszą używać [NSURLSession uploadTaskWithRequest: fromFile:]. W iOS7 otrzymujemy wyjątek podczas korzystania z funkcji uploadTaskWithStreamedRequest: z konfiguracją w tle, ale w systemie iOS8 nie ma wyjątków i wszystko działa poprawnie, gdy aplikacja jest na pierwszym planie, ale gdy dojdzie do tła NSStreamEventEndEncountered zostanie wywołana. Jeśli wiesz, proszę o przekazanie mi dokumentacji Apple. –

+0

Znalazłem to empirycznie, ale zapoznaj się z [Rozważania dotyczące przenoszenia w tle] (https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html#//apple_ref/doc/uid/TP40013509-SW44) w dokumentach firmy Apple, w szczególności "Obsługiwane są tylko zadania przesyłania i pobierania (brak zadań związanych z danymi)." I od pokrewnej (odpowiedź SO) (http://stackoverflow.com/questions/19985353/nsurlsession-uploading-assets-with-background-transfer) "Rozmawiał z inżynierem Apple na imprezie Tech Talks i potwierdził, że tło NSURLSession obsługuje tylko adresy URL plików. " – JVillella

Powiązane problemy