2014-09-23 15 views
5

Mam aplikację na iOS, która współpracuje z serwerem z obsługą Rails, i jest stabilna i niezawodna przez 3 lata. Serwer wymaga certyfikacji Basic i SSL i działało idealnie bez zarzutu aż do iOS 7.Podstawowe błędy uwierzytelniania w systemie iOS 8

Jednak obecnie widzę problemy z uwierzytelnianiem z urządzeniami z systemem iOS 8. Urządzenia/symulatory pracujące pod numerem < iOS 8 nadal dobrze pracować.

Przy inicjalizacji aplikacji występuje szereg żądań danych do synchronizacji z serwerem, który musi przekazać uwierzytelnianie podstawowe.

Wynikają one w następujący sposób delegata miano,

willSendRequestForAuthenticationChallenge 

... a problem występuje, ponieważ te są kwestionowane w nieskończoność - kod celowo nie na drugim razem, gdy [wyzwanie previousFailureCount]> 0 (Ścieżka kodu postępuje zgodnie ze standardową praktyką, wywołując cancelAuthenticationChallenge, jeśli poprzedniFailureCount> 0) - patrz poniżej.

Mam zalogowany identyfikatory wyzwanie, a te są różne w całej każde wyzwanie, nawet gdy 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 
     } 
    } 
} 

Gdybym wybić wezwanie do sprawdzenia previousFailureCount, nie są nieograniczone wywołań metoda wyzwania.

Jednak po niepowodzeniu tych niepowodzeń, kolejne i późniejsze "indywidualne" żądania NSUrlRequests zostają uwierzytelnione.

Ten problem dotyczy również systemu iOS 8. Jakieś pomysły, dlaczego "szybka" kolejność żądań uwierzytelnienia zakończyłaby się niepowodzeniem w systemie iOS 8, ale działa w systemie iOS 7?

Dzięki.

+0

Proszę podać pełny kod dla metody 'connection: willSendRequestForAuthenticationChallenge:'. – CouchDeveloper

+0

@CouchDeveloper Zrobione, dziękuję za zainteresowanie. – Snips

+2

Mam ten sam problem, ale jest on związany z zadaniami i pobieraniem NSURLSession. Nie mogę wymyślić, jak po prostu dowiedzieć się, ile błędów jest dla zadania. I nie w sumie. Nie mogę znaleźć żadnego sposobu, aby zrobić to teraz, gdy varFileureCount var zachowuje się inaczej. – Salx

Odpowiedz

1

W przypadku, gdy nie są obsługi metody uwierzytelniania (NSURLAuthenticationMethodHTTPBasic) Państwo musi powołać jedną z tych metod i tak:

useCredential:forAuthenticationChallenge: 

continueWithoutCredentialForAuthenticationChallenge: 

cancelAuthenticationChallenge: 

performDefaultHandlingForAuthenticationChallenge: 

rejectProtectionSpaceAndContinueWithChallenge: 

Jeśli chcesz ignorować pewną metodę uwierzytelniania Ci korzystne może chcieć wywołać performDefaultHandlingForAuthenticationChallenge: .

Zobacz także: connection:willSendRequestForAuthenticationChallenge:

0

Mam ten sam problem, usunąłem if ([wyzwanie previousFailureCount] == ​​0), i to działa.

Ale nie wiem, dlaczego to się nie powiedzie w IOS 8.

+1

Dzięki, ale dla mnie, usunięcie tego czeku powoduje niekończące się niepowodzenia w uwierzytelnianiu, a poprzedniFailureCount tylko się podnosi. – Snips

0

FYI, podobne zachowanie zaobserwowałem w mojej aplikacji. Widzę go tylko dla tych żądań, które nie mogły zostać uruchomione natychmiast, ale raczej musiały czekać na inne żądania sieciowe, ale podstawowy autoryzacja nie powiodła się.

Użycie kolejki operacji, aby upewnić się, że nie ma więcej niż 4 jednoczesnych żądań, rozwiązało ten problem (oczywiście, zawijanie NSURLConnection w asynchronicznej podklasie NSOperation). Również użycie opcji NSURLSession rozwiązało problem.

Wygląda to na błąd iOS 8 z podstawowym uwierzytelnieniem z NSURLConnection.

Powiązane problemy