Errores básicos de authentication con iOS 8

Tengo una aplicación de iOS que interactúa con un server que ejecuta Rails, y ha sido estable y confiable durante 3 años. El server requiere certificación básica y SSL, y esto ha estado funcionando perfectamente incluso e incluye iOS 7.

Sin embargo, ahora estoy viendo problemas de authentication con dispositivos que ejecutan iOS 8. Los dispositivos / simuladores que ejecutan <iOS 8 continúan funcionando bien.

En la initialization de la aplicación, hay una oleada de requestes de datos para sincronizar con el server que necesita pasar la authentication básica.

Esto da como resultado que se llame al siguiente método de delegado,

willSendRequestForAuthenticationChallenge 

… y el problema se produce porque se cuestionan incesantemente: el código falla deliberadamente en el segundo bash cuando [challenge previousFailureCount]> 0 (la ruta del código sigue la práctica estándar llamando a cancelAuthenticationChallenge if theFailureCount previous> 0) – ver a continuación.

He registrado los identificadores de desafío, y estos son diferentes en cada desafío, incluso cuando el PreviousFailureCount> 0.

 - (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPBasic]) { if ([challenge previousFailureCount] == 0) { NSURLCnetworkingential *newCnetworkingential; newCnetworkingential = [NSURLCnetworkingential cnetworkingentialWithUser:MY_USERNAME password:MY_PASSWORD persistence:NSURLCnetworkingentialPersistenceForSession]; // Retain for rest of session [[challenge sender] useCnetworkingential:newCnetworkingential forAuthenticationChallenge:challenge]; } else { [[challenge sender] cancelAuthenticationChallenge:challenge]; // ...error will be handled by connection didFailWithError } } } 

Si elimino la llamada para verificar el PreviousFailureCount, hay infinitas invocaciones del método de desafío.

Sin embargo, una vez que esta ráfaga de fallas ha fallado, las NSUrlRequests "individuales" posteriores y posteriores se autentican con éxito.

Una vez más, este problema es específico para iOS 8. ¿Alguna idea de por qué una sucesión de requestes de authentication "rápida" fallaría en iOS 8, pero funcionaría en iOS 7?

Gracias.

En caso de que no esté manejando el método de authentication (NSURLAuthenticationMethodHTTPBasic), debe invocar uno de estos methods de todos modos:

 useCnetworkingential:forAuthenticationChallenge: continueWithoutCnetworkingentialForAuthenticationChallenge: cancelAuthenticationChallenge: performDefaultHandlingForAuthenticationChallenge: rejectProtectionSpaceAndContinueWithChallenge: 

Si desea ignorar un método de authentication determinado, quizás performDefaultHandlingForAuthenticationChallenge: invocar performDefaultHandlingForAuthenticationChallenge:

Véase también: connection: willSendRequestForAuthenticationChallenge:

Tengo el mismo problema, eliminé el if ([challenge previousFailureCount] == ​​0) y funciona.

Pero no sé por qué falla en IOS 8.

La respuesta / actualización de esta pregunta también solucionó el problema que estaba viendo.

NSURLConnection se agota en iOS8

Una vez más, algo cambió en iOS 8, que requiere esta solución.

Para su información, descubrí un comportamiento similar en mi aplicación. Solo lo veo para aquellas requestes que no pudieron ejecutarse de inmediato, sino que tuvieron que esperar otras requestes de networking, pero falló la authentication básica.

El uso de la queue de operaciones para asegurarme de que no tengo más de 4 requestes simultáneas resolvió este problema (obviamente, envolviendo la NSURLConnection en una subclass de NSOperation asíncrona). También utilizando NSURLSession también resolvió el problema.

Esto parece un error de iOS 8 con authentication básica con NSURLConnection .