27 votes

Est-il possible pour une UIWebView d'enregistrer et de remplir automatiquement les valeurs de formulaire précédemment saisies (par exemple, le nom d'utilisateur et le mot de passe) ?

Je construis une application iPhone qui est juste une UIWebView d'un site mobile existant qui a une connexion basée sur un formulaire. Lorsque je me connecte au site mobile sur iPhone Safari, je suis invité à enregistrer mon nom d'utilisateur et mon mot de passe, qui sont ensuite remplis automatiquement lorsque je retourne sur le site.

J'aimerais activer la même fonctionnalité dans l'application UIWebView mais je n'arrive pas à trouver comment le faire. Des idées ?


Solution

En suivant le modèle de base de Michael (voir réponse acceptée), j'ai réussi à le faire. Voici ce que j'ai fait :

DONNÉES DE RÉGLAGE

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; {

    //save form data
    if(navigationType == UIWebViewNavigationTypeFormSubmitted) {

        //grab the data from the page
        NSString *username = [self.webView stringByEvaluatingJavaScriptFromString: @"document.myForm.username.value"];
        NSString *password = [self.webView stringByEvaluatingJavaScriptFromString: @"document.myForm.password.value"];

        //store values locally
        [[NSUserDefaults standardUserDefaults] setObject:username forKey:@"username"];
        [SFHFKeychainUtils storeUsername:username andPassword:password forServiceName:@"MyService" updateExisting:YES error:nil];

    }    

}

OBTENIR DES DONNÉES

- (void)webViewDidFinishLoad:(UIWebView *)webView{

    //verify view is on the login page of the site (simplified)
    NSURL *requestURL = [self.webView.request URL];
    if ([requestURL.host isEqualToString:@"www.mydomain.com"]) {

        //check for stored login credentials
        NSString *username = [[NSUserDefaults standardUserDefaults] objectForKey:@"username"];

        if (username.length != 0 ) {

            //create js strings
            NSString *loadUsernameJS = [NSString stringWithFormat:@"document.myForm.username.value ='%@'", username];
            NSString *password = [SFHFKeychainUtils getPasswordForUsername: username andServiceName:@"MyService" error:nil];
            if (password.length == 0 ) password = @"";
            NSString *loadPasswordJS = [NSString stringWithFormat:@"document.myForm.password.value ='%@'", password];

            //autofill the form
            [self.webView stringByEvaluatingJavaScriptFromString: loadUsernameJS];
            [self.webView stringByEvaluatingJavaScriptFromString: loadPasswordJS];

        }
    }   
}

Notez que j'utilise l'excellent outil de Buzz Andersen. SFHFKeychainUtils pour stocker des données sensibles dans le trousseau d'iOs.

Afin de faire fonctionner SFHFKeychainUtils, vous devez faire quelques choses :

  1. Añadir SFHFKeychainUtils.h y SFHFKeychainUtils.m à votre projet
  2. Ajouter le Security.framework à votre projet
  3. #import <Security/Security.h> y #import "SFHFKeychainUtils.h"

3voto

Michael Dillon Points 937

D'après ce que je vois, je ne pense pas qu'il existe un moyen facile de le faire. Voici une idée de ce que pourrait travailler cependant :

  • créer votre uiwebview
  • créer une nsurlrequest
  • après que la fonction de chargement de la page du délégué webview se soit déclenchée, regardez dans le corps de la requête http.
  • trouver le formulaire de connexion (regex pour les formulaires de connexion courants ?)
  • récupérer donner à l'utilisateur la possibilité de l'enregistrer et de le récupérer plus tard.

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