6

我正在运行一个后台 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 响应。除了NSURLDataTask之外,我在NSURLSession的委托回调中没有看到这一点,但我们不能在后台使用数据任务,那么我们应该如何获取 JSON 响应呢?任何帮助表示赞赏

编辑:

我通常在后台运行应用程序时遇到这个问题(主要是当它被踢出内存而不是暂停时)。我已经在 appDelegate 中实现了回调,并且我能够与会话重新关联。我认为 didFinishDownloadingToURL 仅在成功完成任务的情况下被调用,但是当任务失败时,不能保证它会被调用但在另一方面,每次发生故障时都会调用 didCompleteWithError

4

1 回答 1

0

使用下载任务,您可以使用didFinishDownloadingToURL您所说的获取数据。

所有 NSURLSession 任务也有这个委托。如果你进入这里并且错误不是零,那么你有一个错误。无需完成即可进入此处。如果它确实在此处出现错误,则didFinishDownloadingToURL不会调用委托。

如果没有错误,并且您的所有数据都已下载,则将调用两个代表。

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    NSLog(@"didCompleteWithError");
}

编辑:

所以必须打赌没有正确设置,因为必须有一种方法来获取数据。

您是否在您的 AppDelegate 中实现application:handleEventsForBackgroundURLSession:completionHandler:它将您的应用程序连接到完成处理程序以获取委托调用?

我强烈推荐观看 2013 年 WWDC 会议 #705,“Foundation Networking 中的新功能”。后台会话演讲在 32 分钟左右开始,代码演示在 37:50 左右开始

于 2013-10-24T19:06:00.223 回答