Ios NSUrlConnection->;NSURL会议;不再返回completionHandler错误的NSError

Ios NSUrlConnection->;NSURL会议;不再返回completionHandler错误的NSError,ios,nsurlconnection,nsurlsession,Ios,Nsurlconnection,Nsurlsession,我有一些使用NSUrlConnection发出异步请求的长期代码,还有一个completionHandler块来处理它。不久前,为了一些小的额外功能,我切换到了NSUrlSession,但主要假设它们在实现上是相似的。它们都以相同的方式获取我的completionHandler块,并在完成时调用它。设置有点不同 最近,我发现了一个令人不安的问题,即当实际发生错误时,NSUrlSession没有向completionHandler块返回NSError。该用例用于http 401身份验证问题,通常会

我有一些使用NSUrlConnection发出异步请求的长期代码,还有一个completionHandler块来处理它。不久前,为了一些小的额外功能,我切换到了NSUrlSession,但主要假设它们在实现上是相似的。它们都以相同的方式获取我的completionHandler块,并在完成时调用它。设置有点不同

最近,我发现了一个令人不安的问题,即当实际发生错误时,NSUrlSession没有向completionHandler块返回NSError。该用例用于http 401身份验证问题,通常会返回一个N错误代码-1012。对于NSUrlSession,NSError为零

无论我是否使用代理,这都是正确的。并且也不会返回错误委托

为什么NSUrlSession不会返回此错误

void (^connectionCompletionHandlerBlock)(NSData *data, NSURLResponse *response, NSError *error) = ^(NSData *data, NSURLResponse *response, NSError *error){
   if(error){
      // handle error
      if(error.code == -1012){  // such as http 401 login error
         // auth error
      }
   } else {
      // no error
   }
}

NSString *url = @"http://blahblah.com";
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];

// configure urlRequest with params, etc
NSUrlConnection way:(针对401错误返回nserror-1012)

NSUrlSession方式:(无nserror-401错误返回1012)

我希望我的401得到的N错误:


Error Domain=NSURERRORDOMAIN Code=-1012“(null)”用户信息={NSERRORFAILINGURSTRINGKEY=,NSUnderlyingError=0x6000047890{Error DOMAINCFN网络代码=-1012“(null)”用户信息={KCFurrerorAuthFailedResponseKey={url=}}},NSERRORFAILINGURKEY=}

经过一点研究后发现。根据设计,NSUrlSession不会返回服务器端错误

注意:NSURLSession不会通过错误报告服务器错误 参数您的应用程序通过该错误接收到的唯一错误 参数是客户端错误,例如无法解析 主机名或连接到主机

通过报告服务器端错误 NSHTTPPURLResponse对象中的HTTP状态代码。更多 有关详细信息,请阅读NSHTTPURL响应的文档,以及 NSURL响应类

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:connectionCompletionHandlerBlock];
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig];
NSURLSessionDataTask *task = [session dataTaskWithRequest:urlRequest completionHandler:connectionCompletionHandlerBlock];
[task resume];