我正在运行一个后台NSURLSession会话,我试图找出一种方法来获取NSURLDownloadTaskDelegate回调之一的JSON响应。我已将会话配置为接受JSON响应。
NSURLSessionConfiguration *backgroundSession = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.Att.Locker.BackgroundUpload"];
backgroundSession.HTTPAdditionalHeaders = @{ @"Accept":@"application/json"};
session = [NSURLSession sessionWithConfiguration:backgroundSession delegate:uploader delegateQueue:nil];
我可以使用以下回调轻松解析NSURLSessionDownloadTasks的JSON响应。它以NSURL的形式将JSON响应写入沙箱。
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
//Reading the Json response from the sandbox using the NSURL parameter
}
我的问题是,如果我遇到错误,上面的回调没有被调用,它似乎只有在成功下载的情况下被调用。由于我使用的是后台会话,因此我无法使用任何NSURLSessionDataDelegate回调。我只能使用NSURLSessionDownloadTaskDelegate和NSURLSessionTaskDelegate,而我可以使用以下回调获取任务响应。我没有在响应中看到JSON。
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
NSHTTPURLResponse *response = (NSHTTPURLResponse *)downloadTask.response;
NSDictionary *httpResponse = [response allHeaderFields];
NSLog(@"Response Header Fields:%@",[httpResponse allKeys]);
}
NSURLConnection有一个didReceiveData参数,它为我们提供了一个NSData对象,我们可以用它来获取JSON响应。我没有在NSURLSession的委托回调中看到,除了NSURLDataTask,但我们不能在后台使用数据任务,那么我们应该如何获得JSON响应呢?任何帮助表示赞赏
编辑:
我通常在后台运行应用程序时遇到此问题(主要是当它被踢出内存而不是暂停时)。我已经在appDelegate中实现了回调,并且我能够重新关联session.I认为didFinishDownloadingToURL仅在成功完成任务的情况下被调用,但是当任务失败时,不能保证它将被调用但是在每次出现故障时,都会调用didCompleteWithError
使用下载任务,您可以按照说明使用didFinishDownloadingToURL
获取数据。
所有NSURLSession任务也都有此委托。如果你进入这里并且错误不是零,那么你就错了。它不需要完成进入这里。如果它确实带有错误,那么将不会调用委托didFinishDownloadingToURL
。
如果没有错误,并且所有数据都下载,则会调用两个代理。
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"didCompleteWithError");
}
编辑:
所以有必要打赌没有正确设置,因为必须有一种方法来获取数据。
您是否在AppDelegate中实现application:handleEventsForBackgroundURLSession:completionHandler:它会将您的应用程序挂钩到完成处理程序以获取委托调用?
我强烈建议观看2013年WWDC会议#705,"Whats New in Foundation Networking"。后台会话开始大约32分钟,代码演示开始于37:50左右