9

AFNetworking kullanarak büyük dosyalar yüklemeye çalışıyorum ve uygulama arka planda olduğunda yüklemeyi devam ettirmeye çalışıyorum.AFnetworking kullanarak arka planda nasıl görev yüklenir

Ben sadece iyi dosya yüklemek, ancak ben bir arka plan konfigürasyonu kullanmaya çalıştığınızda - Aşağıdaki stacktrace ile uygulama çöker: İstisna: EXC_BAD_ACCESS (kod = 1, adres = 0x8000001f))

_CFStreamSetDispatchQueue 
-[__NSCFBackgroundDataTask captureStream:] 
__70-[__NSCFBackgroundDataTask _onqueue_needNewBodyStream:withCompletion:]_block_invoke_2 
_dispatch_call_block_and_release 
_dispatch_queue_drain 
_dispatch_queue_invoke 
_dispatch_root_queue_drain 
_dispatch_worker_thread3 
_pthread_wqthread 

İşte bazı örnek kod:

Not: [NSURLSessionConfiguration defaultSessionConfiguration] kullandığımda, yükleme başarılı olur, ancak uygulama arka planda olduğunda devam etmez. [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.company.appname.uploadservice"], uygulamanın çökmesine neden oluyor.

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:[uploadBundle.uploadUrl absoluteString] parameters:[uploadBundle getParameters] constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
    [formData appendPartWithFileURL:uploadBundle.fileDataUrl name:uploadBundle.fileName fileName:uploadBundle.fileName mimeType:uploadBundle.mimeType error:nil]; 
} error:nil]; 

Authentication *authentication = [Authentication getInstance]; 
[request addValue:authentication.token forHTTPHeaderField:@"token"]; 
[request addValue:authentication.authorization forHTTPHeaderField:@"Authorization"]; 

//NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.company.appname.uploadservice"]; 
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 

NSProgress *progress = nil; 
_currentUploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { 
    if (error) { 
     NSLog(@"Error: %@", error); 
    } else { 
     NSLog(@"%@ %@", response, responseObject); 
    } 
}]; 
+1

'da açıklandığı gibi başarısız olursa, herhangi bir çözüm buldunuz mu? Ben aynı sorunla karşı karşıyayım. Lütfen bana yardım et. –

cevap

7

Birkaç soruma yardım edeceğini umarak kendi sorumu yanıtlıyorum.

Bu belgeyi her yerde bulamıyorum, ancak arka plan oturum yapılandırması kullanırken uploadTaskWithRequest:fromFile:progress:completionHandler:'u kullanmanız gerekiyor.

AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate]; 

id config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.opentext.core.uploadservice"]; 
id session = [NSURLSession sessionWithConfiguration:config delegate:appDelegate delegateQueue:[NSOperationQueue new]]; 

OMGMultipartFormData *multipartFormData = [OMGMultipartFormData new]; 
//[multipartFormData addFile:data parameterName:@"file" filename:nil contentType:nil]; 
[multipartFormData addParameters:[uploadBundle getParameters]]; 

NSURLRequest *rq = [OMGHTTPURLRQ POST:[uploadBundle.uploadUrl absoluteString] :multipartFormData]; 

id path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"upload.NSData"]; 
[rq.HTTPBody writeToFile:path atomically:YES]; 

[[session uploadTaskWithRequest:rq fromFile:[NSURL fileURLWithPath:path]] resume]; 
+0

Yukarıda da aynı sorunla karşılaştım. Benim durumumda, tek istekte birden fazla dosya yüklemem gerekiyor. Bu şekilde tek bir istek için birden fazla dosya eklemek mümkün mü? – Inoka

+0

Bunu bulmaya çalıştığım OMGMultipartFormData Dosyalarını paylaşabilir misiniz Ama Anlamadım. –

+4

Bu cevap oldukça açık değil. UploadBundle nedir? Ve 'id yolu' ile ne yapmaya çalışıyorsun? – Raptor

0

sorunlar bir yerine dosyanın "isteği akış" kullanmaya çalıştıklarını gibi görünüyor: Burada

basit bir örnek. Kod ile çalışır

NSURLSessionUploadTask * uploadTask = [yöneticisi uploadTaskWithRequest: istek fromFile: [NSURL fileURLWithPath: filePath] ilerleme: & ilerleme completionHandler:^(NSURLResponse * tepki, id responseObject, NSError * hatası) {

. ... }]; Herhangi bir sorun olmadan

yöntemi. Ayrıca gerçek dosya yerine dosya verilerini kullanmaya çalıştığınızda (uploadTaskWithRequest: fromData: progress: completionHandler :) ile) yükleme işlemi Upload tasks from NSData are not supported in background sessions

+0

Yani her seferinde sadece bir dosya yükleyebilir misiniz? MultipartFormData eşdeğeri yok mu? – shim

+3

Çok parçalı verileri yükleyebilir, sadece çok parçalı verileri bir dosyaya kaydetmeniz ve ardından dosyayı yüklemeniz yeterlidir.Daha sonra, [seri hale requestWithMultipartFormRequest: talep writingStreamContentsToFile: filePathtemp completionHandler:^(NSError * hatası) { NSURLSessionUploadTask * uploadTask = [self.activeSessionManager uploadTaskWithRequest: talep fromFile: filePathtemp ilerleme: ve ilerleme completionHandler:^(NSURLResponse * yanıt, kimlik responseObject, NSError * hata) { }]; [uploadTask özgeçmişi]; }]; – tuttu47

İlgili konular