NSURLSessionDownloadTaskDelegate JSON响应

los*_*und 6 iphone objective-c ios nsjsonserialization nsurlsession

我正在运行一个后台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];
Run Code Online (Sandbox Code Playgroud)

我可以使用以下回调轻松解析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
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我遇到错误,上面的回调没有被调用,它似乎只有在成功下载的情况下被调用.由于我使用的是后台会话,因此我无法使用任何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]);
}
Run Code Online (Sandbox Code Playgroud)

NSURLConnection有一个didReceiveData参数,它为我们提供了一个NSData对象,我们可以用它来获取JSON响应.我没有在NSURLSession的委托回调中看到除了NSURLDataTask,但是我们不能在后台使用数据任务,那么我们应该如何获得JSON响应呢?任何帮助表示赞赏

编辑:

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

Rya*_*anG 0

使用下载任务,您可以按照您的说明获取数据didFinishDownloadingToURL

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

如果没有错误,并且所有数据都已下载,那么两个代表都会被调用。

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

编辑:

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

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

我强烈建议观看 2013 年 WWDC 会议#705,“基础网络的新增功能”。后台会议谈话在 32 分钟左右开始,代码演示在 37:50 左右开始

  • @lostfound我担心存在一个问题:在“URLSession:task:didCompleteWithError:”中,您可以通过测试 _error_ 是否为“nil”来检查是否有响应。如果是这种情况,您应该能够从参数 _task_ 的响应 (NSURLResponse) 中获取状态代码。然而,似乎没有办法获得_response body_。可能是这样,NSURLSession 只会在状态码为 200(OK)的情况下将正文写入 URL。NSURLSession 仍处于起步阶段,我建议报告错误。这不是 NSURLSession 中第一个已知的设计缺陷:/ (3认同)