2016-04-21 99 views
0

URLSession:didReceiveChallenge:completionHandler:方法NSURLSessionDelegate被調用?當我收到403狀態代碼的回覆時,它是否打電話給我?使用NSURLSession委託授權

如果我在授權後更改第二個請求的請求正文,我可以使用此委託方法進行授權嗎? (我應該改變@"ticket"

NSURLSession *session = [NSURLSession sharedSession]; 
NSError *error; 
NSDictionary *mapData = @{ 
          @"userIdentity": @{ 
            @"ticket": [SecretStorage sharedInstance].ticket, 
            @"hotelId": [SecretStorage sharedInstance].hotelId, 
            @"language": @"ru" 
            } 
          }; 
NSData *postData = [NSJSONSerialization dataWithJSONObject:mapData options:0 error:&error]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"example.com"] 
                 cachePolicy:NSURLRequestUseProtocolCachePolicy 
                timeoutInterval:60.f]; 
[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPMethod:@"POST"]; 
[request setHTTPBody:postData]; 

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request 
              completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
               NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
               NSLog(@"%@", json); 
              }]; 
[dataTask resume]; 

回答

2

有在NSURLSession的代表兩種不同的挑戰/響應處理程序。第一個,你正在實現,是在會話級別,基本上處理服務器級別的認證。

- 對於會話級的挑戰,NSURLAuthenticationMethodNTLM,NSURLAuthenticationMethodNegotiate,NSURLAuthenticationMethodClientCertificate,或NSURLAuthenticationMethodServerTrust-的NSURLSession對象調用會議委託的URLSession:didReceiveChallenge:completionHandler:方法。如果您的應用程序未提供會話委託方法,則NSURLSession對象會調用任務委託人的URLSession:task:didReceiveChallenge:completionHandler:方法來處理該挑戰。

- 對於非會話級別的挑戰(所有其他),NSURLSession對象調用會話委託的URLSession:task:didReceiveChallenge:completionHandler:方法來處理挑戰。如果您的應用程序提供了會話委託,並且您需要處理身份驗證,那麼您必須在任務級別處理身份驗證,或者提供明確調用每會話處理程序的任務級別處理程序。會話委託的URLSession:didReceiveChallenge:completionHandler:方法不針對非會話級別的挑戰。

因此,您可能希望通過在委託對象中添加對NSURLSessionTaskDelegate的協議支持來處理任務級別的身份驗證,並在任務級別提供處理程序,即URLSession(_:task:didReceiveChallenge:completionHandler:)

欲瞭解更多信息,請訪問link