如何获取backgroundSession NSURLSessionUploadTask响应
我已经实现了一个在后台运行的NSURLSession(因此即使应用程序被挂起,它也可以使用系统守护程序继续执行任务)。 问题是
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
永远不会被称为。 我需要知道响应状态,以便我能正确处理上传失败。 根据另一篇文章,一位Apple工程师告诉我,当会话为backgroundSession时,不会调用此委托方法来阻止应用程序唤醒。 关于如何解决这个问题的任何建议? 在我的情况下调用的最后一个URLSession委托方法是:
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
完成上传后,应调用URLSession:task:didCompleteWithError:
方法。 请参阅task.response
对象,该对象应为NSHTTPURLResponse
对象。
我确定你这样做,但标准的后台上传任务组件是:
-
进行后台会话:
NSURLSessionConfiguration *backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.domain.app"]; NSURLSession *session = [NSURLSession sessionWithConfiguration:backgroundConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
-
使用
NSURLSession
方法uploadTaskWithRequest:fromFile:
方法:NSURLSessionTask *task = [session uploadTaskWithRequest:request fromFile:fileURL]; [task resume];
通过后台会话,您必须:
-
使用
NSURLSessionUploadTask
; -
使用基于文件的再现(您不能使用基于
NSData
的版本); -
使用基于委托的再现不能使用数据任务; (b)
NSURLSessionUploadTask
NSData
再现; 也不是(c)NSURLSessionUploadTask
的完成块再现。
-
-
使用上传任务,请确保不要调用
NSMutableRequest
setHTTPBody
。 使用上传任务时,请求正文不能在请求本身中。 -
确保实现适当的
NSURLSessionDelegate
,NSURLSessionTaskDelegate
方法。 -
确保在app delegate中实现
application:handleEventsForBackgroundURLSession:
这样你就可以捕获你将在URLSessionDidFinishEventsForBackgroundURLSession
调用的URLSessionDidFinishEventsForBackgroundURLSession
。