2014-09-23 9 views
5

Ich habe eine iOS-App, die mit einem Server mit Rails interagiert und seit 3 ​​Jahren stabil und zuverlässig ist. Der Server benötigt eine Basic- und SSL-Zertifizierung, und das funktioniert tadellos bis einschließlich iOS 7.Fehler bei der Standardauthentifizierung mit iOS 8

Ich sehe jedoch jetzt Authentifizierungsprobleme mit Geräten, die iOS 8 laufen funktioniert gut.

Bei der App-Initialisierung gibt es eine Flut von Datenanforderungen zur Synchronisierung mit dem Server, die die Standardauthentifizierung übergeben müssen.

Diese ergeben sich in der folgenden Delegatmethode treten

willSendRequestForAuthenticationChallenge 

genannt zu werden ... und das Problem, weil diese endlos in Frage gestellt werden - der Code absichtlich beim zweiten Versuch schlägt fehl, wenn [Herausforderung previousFailureCount]> 0 (Der Codepfad folgt der Standardpraxis, indem cancelAuthenticationChallenge aufgerufen wird, wenn der vorherigeFailureCount> 0 ist) - siehe unten.

Ich habe die Herausforderung ids angemeldet, und diese sind über jede Herausforderung anders, auch wenn der previousFailureCount> 0.

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 

    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPBasic]) 
    { 
     if ([challenge previousFailureCount] == 0) 
     { 
      NSURLCredential *newCredential; 

      newCredential = [NSURLCredential credentialWithUser:MY_USERNAME 
          password:MY_PASSWORD 
          persistence:NSURLCredentialPersistenceForSession]; // Retain for rest of session 

      [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge]; 
     } 
     else 
     { 
      [[challenge sender] cancelAuthenticationChallenge:challenge]; 

      // ...error will be handled by connection didFailWithError 
     } 
    } 
} 

Wenn ich den Anruf knock out die previousFailureCount zu überprüfen, gibt es unendlich viele Anrufungen die Herausforderung Methode.

Sobald jedoch diese Flut von Fehlern fehlgeschlagen ist, werden die nachfolgenden und späteren 'einzelnen' NSUrlRequests erfolgreich authentifiziert.

Auch dieses Problem ist spezifisch für iOS 8. Irgendwelche Ideen, warum eine "schnelle" Abfolge von Authentifizierungsanforderungen in iOS 8 fehlschlagen würde, aber in iOS 7 funktionieren?

Danke.

+0

Bitte zeigen Sie den vollständigen Code für Methode 'Verbindung: willSendRequestForAuthenticationChallenge:'. – CouchDeveloper

+0

@CouchDeveloper Fertig, danke für Ihr Interesse. – Snips

+2

Ich habe das gleiche Problem, aber es ist mit NSURLSession Tasks und Downloads. Ich kann nicht herausfinden, wie man einfach herausfinden kann, wie viele Fehler für eine _task_ sind. Und nicht insgesamt. Ich kann keine Möglichkeit finden, dies jetzt zu tun, da sich das vorherigeFailureCount var anders verhält. – Salx

Antwort

1

Falls Sie die Authentifizierungsmethode nicht Handling (NSURLAuthenticationMethodHTTPBasic) Sie müssen trotzdem eine dieser Methoden aufrufen:

useCredential:forAuthenticationChallenge: 

continueWithoutCredentialForAuthenticationChallenge: 

cancelAuthenticationChallenge: 

performDefaultHandlingForAuthenticationChallenge: 

rejectProtectionSpaceAndContinueWithChallenge: 

Wenn Sie eine bestimmte Authentifizierungsmethode ignorieren möchten Sie bevorzugen wollen könnte performDefaultHandlingForAuthenticationChallenge: aufzurufen . auch

Siehe: connection:willSendRequestForAuthenticationChallenge:

0

ich das gleiche Problem haben, das ich gelöscht habe die if ([Herausforderung previousFailureCount] == ​​0), und es funktioniert.

Aber ich weiß nicht, warum es in IOS versagt 8.

+1

Danke, aber für mich führt das Entfernen dieser Prüfung nur zu endlosen Fehlern bei der Authentifizierung, der vorherige FailureCount stürzt einfach ab. – Snips

0

FYI, ich entdeckte ähnliches Verhalten in meiner App. Ich sehe es nur für die Anfragen, die nicht sofort ausgeführt werden konnten, sondern musste auf andere Netzwerkanforderungen warten, aber grundlegende Authentifizierung fehlgeschlagen.

Die Verwendung der Operationswarteschlange, um sicherzustellen, dass ich nicht mehr als 4 gleichzeitige Anfragen habe, löste dieses Problem (natürlich die NSURLConnection in eine asynchrone NSOperation Unterklasse einwickelnd). Auch mit NSURLSession löste sich stattdessen das Problem.

Das sieht wie ein Fehler iOS 8 mit Standardauthentifizierung mit NSURLConnection aus.

Verwandte Themen