如何使用networking上传后台上传任务

我正尝试使用AFNetworking上传大文件,并在应用程序处于后台时继续上传。

我可以上传文件,但是当我尝试使用后台configuration时 – 应用程序崩溃,出现以下堆栈跟踪:exception:EXC_BAD_ACCESS(code = 1,address = 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 

以下是一些示例代码:

注意:当我使用[NSURLSessionConfiguration defaultSessionConfiguration] ,上传成功,但当应用程序在后台时不会继续。 [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.company.appname.uploadservice"]导致应用程序崩溃。

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

我正在回答自己的问题,希望能帮助几个人。

我无法在任何地方find这个文件,但看起来像你必须使用uploadTaskWithRequest:fromFile:progress:completionHandler:当使用后台会话configuration。

这是一个简单的例子:

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

问题似乎是,您正在尝试使用“stream式传输的请求”而不是文件。 代码适用于

NSURLSessionUploadTask * uploadTask = [manager uploadTaskWithRequest:request fromFile:[NSURL fileURLWithPath:filePath] progress:&progress completionHandler:^(NSURLResponse * response,id responseObject,NSError * error){

….}];

方法没有任何问题。 我还发现,如果您尝试使用文件数据而不是实际文件(uploadTaskWithRequest:fromData:progress:completionHandler :),则上传将失败,正如在NSData上传任务中所解释的,后台会话不支持