2016-04-21 7 views
0

Wenn URLSession:didReceiveChallenge:completionHandler: Methode von NSURLSessionDelegate heißt? Hat es angerufen wenn ich eine Antwort mit 403 Statuscode bekomme?Verwenden NSURLSession Delegat für die Autorisierung

Kann ich diese Delegate-Methode für die Autorisierung verwenden, wenn ich den Anfragetext für die zweite Anfrage nach der Autorisierung ändern soll? (Ich sollte @"ticket" ändern)

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

Antwort

2

Es gibt zwei verschiedene Challenge/Response-Handler in NSURLSession Delegierten. Der erste, den Sie implementieren, befindet sich auf Sitzungsebene und behandelt im Wesentlichen die Authentifizierung auf Serverebene.

-Für Sitzungsebene Herausforderungen-NSURLAuthenticationMethodNTLM, NSURLAuthenticationMethodNegotiate, NSURLAuthenticationMethodClientCertificate oder NSURLAuthenticationMethodServerTrust-the NSURLSession Objekt ruft die URLSession Sitzung Delegierten: didReceiveChallenge: completionHandler: Methode. Wenn Ihre App keine Sitzungsdelegate-Methode bereitstellt, ruft das NSURLSession-Objekt die URLSession des Aufgabendelegaten auf: task: didReceiveChallenge: completionHandler: Methode zum Behandeln der Herausforderung.

-Das NSURLSession-Objekt ruft bei Nicht-Session-Level-Challenges (alle anderen) die URLSession des Sitzungsdelegaten auf: task: didReceiveChallenge: completionHandler: Methode zur Behandlung der Challenge. Wenn Ihre Anwendung einen Sitzungsdelegaten bereitstellt und Sie die Authentifizierung durchführen müssen, müssen Sie entweder die Authentifizierung auf der Aufgabenebene behandeln oder einen Handler auf Aufgabenebene bereitstellen, der den pro-Session-Handler explizit aufruft. Die URLSession des Sitzungsdelegaten: didReceiveChallenge: completionHandler: Die Methode wird nicht für nicht auf Sitzungen basierende Herausforderungen aufgerufen.

Wahrscheinlich möchten Sie also die Authentifizierung auf Aufgabenebene behandeln, indem Sie NSURLSessionTaskDelegate in Ihrem Delegatobjekt hinzufügen und einen Handler auf der Aufgabenebene bereitstellen, z. B. URLSession(_:task:didReceiveChallenge:completionHandler:).

Für weitere Informationen gehen Sie zu diesem link