2014-09-23 1 views
5

Ho un'app iOS che interagisce con un server che esegue Rails ed è stabile e affidabile da 3 anni. Il server richiede la certificazione Basic e SSL, e ha funzionato perfettamente fino a iOS 7 incluso.Errore di autenticazione di base con iOS 8

Tuttavia, ora sto vedendo problemi di autenticazione con i dispositivi con iOS 8. Dispositivi/simulatori in esecuzione < iOS 8 continuano a funziona bene

Durante l'inizializzazione dell'app, c'è una raffica di richieste di dati da sincronizzare con il server che deve passare l'autenticazione di base.

Questi risultato nella seguente metodo delegato chiamato,

willSendRequestForAuthenticationChallenge 

... e il problema si verifica perché questi sono sfidati senza fine - il codice non riesce deliberatamente al secondo tentativo, quando [sfida previousFailureCount]> 0 (il percorso del codice segue la pratica standard chiamando cancelAuthenticationChallenge se previousFailureCount> 0) - vedi sotto.

Ho registrato gli ID di sfida, e questi sono diversi attraverso ogni sfida, anche quando il 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 
     } 
    } 
} 

Se ho knock out la chiamata a controllare la previousFailureCount, ci sono infinite invocazioni di il metodo di sfida.

Tuttavia, una volta fallita questa raffica di guasti, le successive e successive "singole" NSUrlRequests vengono autenticate correttamente.

Ancora, questo problema è specifico per iOS 8. Qualche idea sul perché una successione "veloce" di richieste di autenticazione non riuscirebbe in iOS 8, ma funziona in iOS 7?

Grazie.

+0

Mostrare il codice completo per la connessione method ': willSendRequestForAuthenticationChallenge:'. – CouchDeveloper

+0

@CouchDeveloper Fatto, grazie per il vostro interesse. – Snips

+2

Sto riscontrando lo stesso problema, tuttavia è associato alle attività e ai download di NSURLSession. Non riesco a capire come scoprire quanti errori ci sono per un _task_. E non in totale. Non riesco a trovare alcun modo per farlo ora che la variabile previousFailureCount si comporta diversamente. – Salx

risposta

0

La risposta/aggiornamento a questa domanda anche risolto il problema che stavo vedendo.

NSURLConnection timing out on iOS8

Anche in questo caso, qualcosa è cambiato in iOS 8, che richiedono questa correzione.

1

Nel caso in cui non si sta gestendo il metodo di autenticazione (NSURLAuthenticationMethodHTTPBasic) si necessario invocare uno di questi metodi in ogni caso:

useCredential:forAuthenticationChallenge: 

continueWithoutCredentialForAuthenticationChallenge: 

cancelAuthenticationChallenge: 

performDefaultHandlingForAuthenticationChallenge: 

rejectProtectionSpaceAndContinueWithChallenge: 

Se si desidera ignorare un certo metodo di autenticazione preferibile potrebbe voler richiamare performDefaultHandlingForAuthenticationChallenge: .

Vedi anche: connection:willSendRequestForAuthenticationChallenge:

0

Ho lo stesso problema, ho cancellato il if ([sfida previousFailureCount] == ​​0), e funziona.

Ma io non so perché non riesce in IOS 8.

+1

Grazie, ma per me, la rimozione di tale controllo si traduce solo in innumerevoli fallimenti di autenticazione, il precedenteFailureCount si limita a rack. – Snips

0

FYI, ho scoperto un comportamento simile nella mia app. Lo vedo solo per quelle richieste che non sono state in grado di eseguire immediatamente, ma che hanno dovuto attendere altre richieste di rete, ma l'autenticazione di base non è riuscita.

Utilizzare la coda di operazioni per assicurarsi che non abbiate più di 4 richieste simultanee risolto questo problema (ovviamente, avvolgendo NSURLConnection in una sottoclasse asincrona NSOperation). Anche usando NSURLSession invece risolto anche il problema.

Questo è un bug di iOS 8 con autenticazione di base con NSURLConnection.