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