2016-04-21 1 views
0

Lorsque la méthode URLSession:didReceiveChallenge:completionHandler: de NSURLSessionDelegate est appelée? A-t-il appelé quand j'obtiens une réponse avec le code d'état 403? Puis-je utiliser cette méthode de délégation pour l'autorisation si je devrais changer le corps de la demande pour la deuxième demande après l'autorisation? (Je change @"ticket")Utilisation du délégué NSURLSession pour l'autorisation

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]; 

Répondre

2

Il y a deux gestionnaires défi/réponse différents dans les délégués de NSURLSession. Le premier, que vous implémentez, est au niveau de la session et gère essentiellement l'authentification au niveau du serveur.

-Pour défis NSURLAuthenticationMethodNTLM niveau de la session, NSURLAuthenticationMethodNegotiate, NSURLAuthenticationMethodClientCertificate ou NSURLAuthenticationMethodServerTrust l'objet-NSURLSession appelle la URLSession du délégué de la session: didReceiveChallenge: completionHandler: méthode. Si votre application ne fournit pas de méthode de délégation de session, l'objet NSURLSession appelle la méthode URLSession: task: didReceiveChallenge: completionHandler: du délégataire de tâche pour gérer le challenge. -Pour les problèmes de niveau non-session (tous les autres), l'objet NSURLSession appelle la méthode URLSession: task: didReceiveChallenge: completionHandler: du délégué de session pour gérer le challenge. Si votre application fournit un délégué de session et que vous devez gérer l'authentification, vous devez gérer l'authentification au niveau de la tâche ou fournir un gestionnaire de niveau tâche qui appelle explicitement le gestionnaire par session. La propriété URLSession du délégué de session: didReceiveChallenge: completionHandler: n'est pas appelée pour les défis de niveau non session. Par conséquent, vous souhaiterez probablement gérer l'authentification au niveau des tâches en ajoutant le support de protocole pour NSURLSessionTaskDelegate dans votre objet délégué et en fournissant un gestionnaire au niveau de la tâche, c'est-à-dire URLSession(_:task:didReceiveChallenge:completionHandler:).

Pour plus d'informations, rendez-vous à ce link