É possível para um UIWebView salvar e preencher automaticamente os valores de formulário inseridos anteriormente (por exemplo, nome de usuário e senha)?

Estou criando um aplicativo para iPhone que é apenas um UIWebView de um site para dispositivos móveis existente que possui um login baseado em formulário. Quando eu faço o login no site para dispositivos móveis no iPhone Safari, sou solicitado a salvar meu nome de usuário / senha e, em seguida, faço o preenchimento automático quando volto ao site mais tarde.

Eu gostaria de habilitar a mesma funcionalidade no UIWebView , mas para a vida de mim, não consigo descobrir como fazê-lo. Alguma ideia?


Solução

Seguindo o modelo básico de Michael (veja resposta aceita), eu consegui fazer isso. Aqui está o que eu fiz:

CONFIGURAÇÃO DE DADOS

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

OBTER DADOS

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

Observe que estou usando o incrível pacote SFHFKeychainUtils do Buzz Andersen para armazenar dados confidenciais no iOs Keychain.

Para obter o SFHFKeychainUtils funcionando, você precisa fazer algumas coisas:

  1. Adicione SFHFKeychainUtils.h e SFHFKeychainUtils.m ao seu projeto
  2. Adicione o Security.framework ao seu projeto
  3. #import e #import "SFHFKeychainUtils.h"

Do meu olhar, não acho que haja uma maneira fácil de fazer isso. Aqui está uma ideia do que pode funcionar:

  • crie sua uiwebview
  • criar um pedido de nsurl
  • depois que a function de exibição do seu webview delegado é acionada, a function procura no corpo http da solicitação
  • encontrar o formulário para login (regex para formulários de login comuns?)
  • recuperar dar ao usuário a opção de salvá-lo e, em seguida, recuperar mais tarde