我已经实现了一个在后台运行的NSURLSession(因此即使应用程序被挂起,它也可以使用系统守护程序继续执行任务)。问题在于
-(void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
永远不会打电话给。我需要知道响应状态,以便我能正确处理上传失败。根据另一篇文章,一位Apple工程师告诉我,当session为backgroundSession时,不会调用此委托方法来阻止应用程序唤醒。关于如何解决这个问题的任何建议?在我的情况下调用的最后一个URLSession委托方法是:
-(void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
答案 0 :(得分:13)
上传完成后,应调用URLSession:task:didCompleteWithError:
NSURLSessionTaskDelegate
方法。请参阅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)NSData
NSURLSessionUploadTask
的再现;也不是(c)NSURLSessionUploadTask
。
使用上传任务时,请务必不要致电setHTTPBody
的{{1}}。使用上传任务时,请求正文不能出现在请求本身中。
确保您实施了相应的NSMutableRequest
,NSURLSessionDelegate
方法。
确保在您的应用代理中实施NSURLSessionTaskDelegate
(这样您就可以捕获application:handleEventsForBackgroundURLSession:
,您将在completionHandler
中调用。)