如何使用网络上传后台上传任务 [英] How to upload task in background using afnetworking
问题描述
我尝试使用AFNetworking上传大文件,并在应用程序在后台时继续上传。
我可以上传文件,但是当
例外:EXC_BAD_ACCESS(code = 1,address = 0x8000001f))
<$ p $ $ b $ _ $ _ $ _ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ b _dispatch_root_queue_drain
_dispatch_worker_thread3
_pthread_wqthread
以下是一些示例代码:注意:当我使用 [NSURLSessionConfiguration defaultSessionConfiguration]
时,上传成功,但当应用程序在后台时不会继续。 [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@com.company.appname.uploadservice]
导致应用程序崩溃。
<$ p $我们可以通过下面的例子来说明如何使用这个方法来实现这个功能:$ {code> NSMutableURLRequest * request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@POSTURLString:[uploadBundle.uploadUrl absoluteString] parameters:[uploadBundle getParameters] constructBodyWithBlock:^(id< AFMultipartFormData> formData) $ b [formData appendPartWithFileURL:uploadBundle.fileDataUrl name:uploadBundle.fileName fileName:uploadBundle.fileName mimeType:uploadBundle.mimeType error:nil];
}错误:无];
认证*认证= [认证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 :%@,错误);
} else {
NSLog(@%@%@,response,responseObject);
}
}];
我正在回答我自己的问题,希望它将帮助一些人。
$ b $我找不到任何地方记录,但它看起来像你必须使用 uploadTaskWithRequest:fromFile:progress: completionHandler:
当使用后台会话配置时。
这是一个简单的例子:
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:@filefilename:nil contentType:nil];
[multipartFormData addParameters:[uploadBundle getParameters]];
NSURLRequest * rq = [OMGHTTPURLRQ POST:[uploadBundle.uploadUrl absoluteString]:multipartFormData];
$ b $ id path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)lastObject] stringByAppendingPathComponent:@upload.NSData];
[rq.HTTPBody writeToFile:path atomically:YES];
[[session uploadTaskWithRequest:rq fromFile:[NSURL fileURLWithPath:path]] resume];
I'm trying to upload large files using AFNetworking and have the upload continue when the application is in the background.
I can upload files just fine, but when I attempt to use a background configuration -- the application crashes with the following stacktrace: 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
Here is some example code:
Note: When I use [NSURLSessionConfiguration defaultSessionConfiguration]
the upload succeeds but will not continue when the application is in the background. [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.company.appname.uploadservice"]
causes the application to crash.
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);
}
}];
I'm answering my own question in hopes that it will help a few people.
I can't find this documented anywhere, but it looks like you have to use uploadTaskWithRequest:fromFile:progress:completionHandler:
when using a background session configuration.
Here is a simple example:
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];
这篇关于如何使用网络上传后台上传任务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!