2017-03-07 2 views
0

NSUrlConnection을 사용하여 비동기 요청을 한 오랫동안 사용해온 코드와이를 처리하기위한 completionHandler 블록이 있습니다. 오래 전에 NSUrlSession으로 전환 한 적이 있지만, 구현시에는 거의 비슷하다고 가정했습니다. 그들은 둘 다 나의 완성을 잡았다 .Handler는 같은 방식으로 블록을 완성하고 완성하자마자 그것을 불렀다. 설정이 약간 다릅니다.NSUrlConnection -> NSUrlSession; 더 이상 NSError를 반환하지 않습니다 .Handler 오류

최근에 나는 오류가 실제로 발생할 때 NSUrlSession이 NSError를 completionHandler 블록으로 반환하지 않는 불안한 문제를 발견했습니다. 유스 케이스는 일반적으로 NSError 코드 -1012로 돌아 오는 http 401 인증 문제입니다. NSUrlSession의 경우 NSError는 nil입니다.

위임자를 사용하는지 여부에 관계없이 적용됩니다. didFailWithError 대리자도 반환되지 않습니다.

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 방법 : (nserror -1012은 401 오류에 대해 반환)

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:connectionCompletionHandlerBlock]; 

NSUrlSession 방법 : (-1012가 401 오류에 대해 반환 없음 nserror)

NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; 
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig]; 
NSURLSessionDataTask *task = [session dataTaskWithRequest:urlRequest completionHandler:connectionCompletionHandlerBlock]; 
[task resume]; 

내가 예상 NSError 내 401을 얻으려면 :

오류 도메인 = NSURLErrorDomain 코드 = -1012 "(null)"UserInfo = {NSError FailingURLStringKey = https://api/blah, NSUnderlyingError = 0x600004047890 {오류 도메인 = kCFErrorDomainCFNetwork 코드 = -1012 "(널)"사용자 정보 = {_ kCFURLErrorAuthFailedResponseKey = {URL = https://api/blah}}} NSErrorFailingURLKey = https://api/blah} 조금 연구 후에 발견

답변

1

. NSUrlSession은 의도적으로 서버 측 오류를 반환하지 않습니다. NSUrlSession Apple documentation

주에서

: NSURLSession 오류 매개 변수를 통해 서버 오류를보고하지 않습니다. 매개 변수를 통해 앱이받는 유일한 오류는 클라이언트 측 오류입니다 (예 : 호스트 이름을 확인하거나 호스트에 연결할 수 없음).

서버 쪽 오류는 을 통해 NSHTTPURLResponse 개체의 HTTP 상태 코드를 통해보고됩니다. 에 대한 자세한 내용은 NSHTTPURLResponse 및 NSURLResponse 클래스에 대한 설명서를 참조하십시오.