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

StackOverflow https://stackoverflow.com/questions/4772341

Question

Je construis une application iPhone qui est juste un UIWebView d'un site mobile existant qui a une connexion basée sur un formulaire. Lorsque je me connecte sur le site mobile sur iPhone Safari, je vous demande d'enregistrer mon nom d'utilisateur / mot de passe, et il est alors autofilled quand je reviens sur le site plus tard.

Je voudrais permettre à la même fonctionnalité dans le UIWebView, mais pour la vie de moi, je ne peux pas comprendre comment le faire. Toutes les idées?


Solution

Après modèle de base de Michael (voir réponse acceptée), j'ai pu réaliser ce but. Voici ce que je l'ai fait:

Réglage des données

- (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 Buzz Andersen génial SFHFKeychainUtils pour stocker des données sensibles à la SIO Porte-clefs.

Afin d'obtenir SFHFKeychainUtils de travail, vous devez faire quelques petites choses:

  1. Ajouter SFHFKeychainUtils.h et SFHFKeychainUtils.m à votre projet
  2. Ajoutez le Security.framework à votre projet
  3. #import <Security/Security.h> et #import "SFHFKeychainUtils.h"
Était-ce utile?

La solution

De mon recherche, je ne pense pas qu'il y ait un moyen facile de le faire. Voici une idée de ce que peut si le travail:

  • créer votre UIWebView
  • créer un NSURLRequest
  • après votre page délégué WebView incendies de fonction chargée regarder dans le corps http de la requête
  • trouver le formulaire de connexion (regex pour les formulaires de connexion communs?)
  • récupérer donner à l'utilisateur la possibilité de l'enregistrer puis écouter plus tard
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top