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