2016-09-06 6 views
0

ich benutzerdefinierte Protokoll mit Sitzungs Delegat wie unten umgesetzt haben -Auth Herausforderung für NSURLSession nicht mit benutzerdefinierten Protokoll arbeiten

- (void)startLoading { 
NSMutableURLRequest *mReq = [self.request mutableCopy]; 
NSURL *url = [[self request] URL]; 

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 

... 
... 

if(!_mySession) { 
    _mySession = [NSURLSession sessionWithConfiguration:config 
           delegate:self 
         delegateQueue:[NSOperationQueue mainQueue]]; 
} 
..... 
} 

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge 


completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler{ 

NSURLAuthenticationChallenge* challengeWrapper = [[NSURLAuthenticationChallenge alloc] initWithAuthenticationChallenge:challenge sender:[[CustomAuthChallengeWrappers alloc] initWithSessionCompletionHandler:completionHandler]]; 

    if(self.client){ 
      if([self.client respondsToSelector:@selector(URLProtocol:didReceiveAuthenticationChallenge:)]) { 
       debugLog("auth-challenge"); 
       [self.client URLProtocol:self didReceiveAuthenticationChallenge:challengeWrapper]; 
      } 
    } 
} 

Wenn Client verwendet NSURLConnection, es funktioniert gut. Wenn ich NSURLSession auf der Client-Seite verwende, wird die Auth-Abfrage weitergeleitet, aber nicht im benutzerdefinierten Protokoll zurück empfangen. Challenge-Wrapper ist wie folgt implementiert: NSURLProtocol Challenge wrapper

Fehle ich etwas für NSURLSession?

+0

Sie behandeln nicht den Fall, in dem der Challenge-Absender nicht auf diesen Selektor reagiert oder self.client gleich Null ist, aber das ist wahrscheinlich nicht das Problem. Dieser Wrapper scheint eine seltsame Art und Weise zu sein. Normalerweise wäre Ihr NSURLProtocol der Absender der Herausforderung, nicht irgendeine willkürliche "Wrapper" -Klasse. Und normalerweise würden Sie diese Methoden in Ihrem Protokoll implementieren. Ich bezweifle, dass das die Ursache des Problems ist, aber es macht Debugging wahrscheinlich schwieriger (Wortspiel beabsichtigt). – dgatwood

+0

Das wahrscheinlichste Problem ist, dass die andere 'NSURLSession' etwas Seltsames macht, als ob sie nicht richtig auf die Challenge reagiert, aber ich müsste den anderen Code sicher wissen sehen. Sie sollten auch sicherstellen, dass Sie nicht in eine unendliche Rekursion der Protokollbehandlung geraten - stellen Sie sicher, dass Ihr Protokoll alle Anfragen, die es zuvor gesehen hat, z. indem Sie einen benutzerdefinierten Header festlegen oder '[NSURLProtocol setProperty: forKey: inRequest:]' verwenden. – dgatwood

+0

Ein anderes Problem mit NSURLProtocol Challenge Sender funktioniert nicht wie erwartet. Es leitet an den Client weiter, aber der Client trifft direkt den Server, nicht das NSURLProtocol. Server lehnt es ab, weil es von einem anderen Pfad kam. Keine andere Option als Wrapper. Ich stoße auch nicht auf unendliche Rekursion. Derselbe Code funktioniert perfekt mit NSURLConnection auf der Client-Seite. – sona

Antwort

0

Nur zur Aktualisierung funktioniert es gut mit iOS 10 und xcode 8 Beta-Version. Sieht so aus, als gäbe es ein Problem in iOS 9.3, das in dieser Version behoben wurde.

Verwandte Themen