2016-04-21 4 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 вызывает задачу URL-адреса делегата задачи: task: didReceiveChallenge: completeHandler: метод для обработки вызова.

- Для задач, не связанных с сеансом (все остальные), объект NSURLSession вызывает URL-адрес делегата сеанса: task: didReceiveChallenge: completeHandler: метод для обработки вызова. Если ваше приложение предоставляет делегат сеанса, и вам необходимо обработать аутентификацию, вы должны либо обработать аутентификацию на уровне задачи, либо предоставить обработчик на уровне задач, который явно вызовет обработчик для каждого сеанса. URL-адрес делегата сессии: didReceiveChallenge: completeHandler: метод не вызывается для задач, не связанных с сеансом.

Итак, вы, вероятно, захотите обработать проверку на уровне задач, добавив поддержку протокола NSURLSessionTaskDelegate в свой объект-делегат и предоставив обработчик на уровне задачи, то есть URLSession(_:task:didReceiveChallenge:completionHandler:).

Для получения дополнительной информации перейдите по этой ссылке link

Смежные вопросы