37 votes

Comment afficher le défi d'authentification dans UIWebView?

J'essaie d'accéder à un site Web sécurisé via UIWebView. Lorsque j'y accède via safari, je reçois un défi d'authentification mais le même n'apparaît pas dans mon UIWebView dans l'application. Comment puis-je le faire apparaître?

Tout pointeur, exemple de code ou lien sera très utile. Merci beaucoup.

36voto

Sahil Points 888

C'est en fait super facile ... Je suis sûr que vous pouvez simplement afficher un UIAlertView lorsque le délégué de défi d'authentification est affiché (ou avant de charger l'URL, si vous savez avec certitude que l'URL que vous appuyez demandera des informations de connexion d'authentification ). Quoi qu'il en soit, l'astuce consiste à créer votre propre NSURLConnection et je fais un peu de logique pour savoir si le délégué d'authentification a été utilisé.

 - (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;
}
 

5voto

Mickael West Points 151

Vous pouvez également fournir vos informations d'identification dans l'URL. Ajoutez simplement le nom d'utilisateur et le mot de passe entre 'http: //' et 'page url'.

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

4voto

alexandrmoroz Points 86

comme vous le savez, UIWebView ne pas fournir des occasions de communiquer avec le serveur. J'ai résolu ce problème de cette façon: dans la méthode du délégué shouldStartLoadWithRequest de UIWebView j'ai lancer une nouvelle relation avec NSURLConnection, et déjà dans la méthode du délégué NSURLConnection didReceiveAuthenticationChallenge traitées le défi à partir du serveur. Et dans la méthode didReceiveResponse (si le défi est venu) puis à nouveau dans la même UIWebView charge la même URL (défi a déjà été traitée:). N'oubliez pas d'annuler la connexion en didReceiveResponse, sinon, il sera le double de la circulation.

1voto

Fonix Points 2289

si vous ressentez des symptômes de ce que Zach décrites dans les commentaires de Sahil de réponse:

comme y5h dit ainsi, ajouter "_authed = OUI" à la didReceiveResponse méthode qui va arrêter la boucle infinie. même si l'authentification n'a pas été réussie, vous devez le traiter comme si c'était authed donc, il va essayer de continuer le chargement de la page si aucune authentification n'est requise, si l'authentification est vraiment nécessaire, alors il va échouer comme d'habitude.

pour le deuxième problème où le shouldStartLoadWithRequest: les feux à plusieurs reprises (en raison de contenu intégré sur la page web) et il va juste montrer la dernière chose que chargé et pas toute la page web, faites ceci:

dans le shouldStartLoadWithRequest: méthode, ajoutez à cela le top

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

edit: au-dessus de cette méthode a des problèmes si la page est entièrement chargée, puis de charges de plus de contenu incorporé par la suite, rompt avec facebook qui n'est le cas que j'ai vu jusqu'à présent

cela permettra url par le biais de tout le site web est d'essayer de charger. je ne sais pas si sa peut supposer que chaque url après la demande initiale est de contenu intégré, mais pour mes besoins, il semblait fonctionner, alors peut-être il sera pour vous aussi bien.

aussi, l'utilisation

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

parce que

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

sont depricated, et pour moi, on ne pouvait pas s'authentifier avec les sites web https à l'aide de leur

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X