¿Cómo mostrar el desafío de autenticación en UIWebView?

Estoy intentando acceder a un sitio web seguro a través de UIWebView. Cuando accedo a él a través de safari, recibo un desafío de autenticación, pero lo mismo no aparece en mi UIWebView en la aplicación. ¿Cómo puedo hacer que aparezca?

Cualquier puntero, código de muestra o enlaces serán de gran ayuda. Muchas gracias.

En realidad es súper fácil … estoy seguro de que puedes mostrar un UIAlertView cuando se muestra el delegado de desafío de autenticación (o antes de cargar la URL, si sabes con certeza que la URL a la que estás accediendo te pedirá información de inicio de sesión de autenticación) ) De todos modos, el truco es crear tu propia NSURLConnection y hago un poco de lógica para guardar si se ha utilizado el delegado de autenticación.

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; { NSLog(@"Did start loading: %@ auth:%d", [[request URL] absoluteString], _authed); if (!_authed) { _authed = NO; /* pretty sure i'm leaking here, leave me alone... i just happen to leak sometimes */ [[NSURLConnection alloc] initWithRequest:request delegate:self]; return NO; } return YES; } - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; { NSLog(@"got auth challange"); if ([challenge previousFailureCount] == 0) { _authed = YES; /* SET YOUR credentials, i'm just hard coding them in, tweak as necessary */ [[challenge sender] useCredential:[NSURLCredential credentialWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistencePermanent] forAuthenticationChallenge:challenge]; } else { [[challenge sender] cancelAuthenticationChallenge:challenge]; } } - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; { NSLog(@"received response via nsurlconnection"); /** THIS IS WHERE YOU SET MAKE THE NEW REQUEST TO UIWebView, which will use the new saved auth info **/ NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:]]; [_webView loadRequest:urlRequest]; } - (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection; { return NO; } 

También puede proporcionar sus credenciales en la url. Simplemente agregue nombre de usuario y contraseña entre ‘http: //’ y ‘page url’.

 NSString *urlString = @"http://username:password@domain.com/home"; [webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]]; 

como usted sabe, UIWebView no brinda oportunidades para comunicarse con el servidor. Resolví este problema de esta manera: en el método delegado shouldStartLoadWithRequest de UIWebView I iniciando otra conexión con NSURLConnection, y ya en el método del delegado NSURLConnection didReceiveAuthenticationChallenge procesó el desafío desde el servidor. Y en el método didReceiveResponse (si surgió el desafío), de nuevo en el mismo UIWebView carga la misma URL (el desafío ya se ha procesado :). No olvide cancelar la conexión en didReceiveResponse, de lo contrario duplicará el tráfico.

si está experimentando síntomas de lo que Zach describió en los comentarios de la respuesta de Sahil:

como también dijo y5h, agregue `_hedhed = YES ‘al método didReceiveResponse que detendrá el bucle infinito. incluso si la autenticación no fue exitosa, debe tratarla como si hubiera sido autenticada, por lo que intentará continuar cargando la página si no se requiere autenticación, si realmente se requiere autenticación, entonces fallará como siempre.

para el segundo síntoma donde el shouldStartLoadWithRequest: dispara varias veces (debido al contenido incrustado en la página web) y solo mostrará lo último que cargó y no toda la página web, haga esto:

en el método shouldStartLoadWithRequest: agrega esto a la parte superior

 if(webview.loading){ //if url requests come through while its loading, its probably embedded content return YES; } 

editar: este método anterior tiene problemas si la página se carga completamente, y luego carga más contenido incrustado después, se rompe con Facebook, que es el único caso visto hasta ahora

esto permitirá que las URL pasen mientras el sitio web intenta cargar. No estoy seguro de si es seguro suponer que cada url después de la solicitud inicial es contenido incrustado, pero para mi propósito, pareció funcionar, por lo que tal vez sea también para usted.

también, uso

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

porque

 connection:canAuthenticateAgainstProtectionSpace: connection:didReciveAuthenticationChallenge: connection:didCancelAuthenticationChallenge: 

están privados, y para mí, no puedes autenticarte con sitios web https usándolos

Me gustaría sugerir otra respuesta usando el siguiente pod: https://github.com/jivesoftware/JiveAuthenticatingHTTPProtocol

Contiene un ejemplo que muestra cómo usar un UIAlertView para pedirle al usuario la contraseña, y podría adaptarse fácilmente para devolver una contraseña guardada de un DB local, por ejemplo.

Descargo de responsabilidad: de ninguna manera estoy afiliado a Jive ni he estado nunca, esto es solo una sugerencia de una herramienta que me ayudó después de luchar durante días sobre esto.