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)?
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:
- Ajouter
SFHFKeychainUtils.h
etSFHFKeychainUtils.m
à votre projet - Ajoutez le
Security.framework
à votre projet -
#import <Security/Security.h>
et#import "SFHFKeychainUtils.h"
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