我已经实现了一个在后台运行的 NSURLSession(因此即使应用程序被挂起,它也可以使用系统守护进程继续执行任务)。问题是
-(void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
永远不会被调用。我需要知道响应状态,以便正确处理上传失败。根据另一篇帖子,一位 Apple 工程师告诉我们,当 session 为 backgroundSession 时,不会调用此委托(delegate)方法,以防止应用程序被唤醒。关于如何解决这个问题的任何建议?在我的情况下调用的最后一个 URLSession 委托(delegate)方法是:
-(void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
最佳答案
NSURLSessionTaskDelegate
的 URLSession:task:didCompleteWithError:
方法应该在上传完成后被调用。引用task.response
对象,应该是NSHTTPURLResponse
对象。
我确定您正在这样做,但标准的后台上传任务组件是:
进行后台 session :
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];
对于后台 session ,您必须:
使用
NSURLSessionUploadTask
;使用基于文件的再现(不能使用基于
NSData
的版本);使用基于委托(delegate)的再现 不能使用数据任务; (b)
NSData
对NSURLSessionUploadTask
的再现;也不 (c)NSURLSessionUploadTask
的完成 block 再现。
对于上传任务,请确保不要调用
NSMutableRequest
的setHTTPBody
。对于上传任务,请求正文不能在请求本身中。确保您实现了适当的
NSURLSessionDelegate
、NSURLSessionTaskDelegate
方法。确保在您的应用委托(delegate)中实现
application:handleEventsForBackgroundURLSession:
(这样您就可以捕获completionHandler
,您将在URLSessionDidFinishEventsForBackgroundURLSession 中调用它
).
关于ios - 如何获取 backgroundSession NSURLSessionUploadTask 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22487336/