Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible for a UIWebView to save and autofill previously entered form values (e.g., username & password)?

I'm building an iPhone app that is just a UIWebView of an existing mobile site that has a form-based login. When I login to the mobile site on iPhone Safari, I'm prompted to save my username/password, and it's then autofilled when I go back to the site later.

I'd like to enable the same functionality in the UIWebView, but for the life of me, I can't figure out how to do it. Any ideas?


Solution

Following Michael's basic model (see accepted answer), I was able to get this done. Here's what I did:

SETTING DATA

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

GETTING DATA

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

Note that I'm using Buzz Andersen's awesome SFHFKeychainUtils package to store sensitive data to the iOs Keychain.

In order to get SFHFKeychainUtils working, you need to do a few things:

  1. Add SFHFKeychainUtils.h and SFHFKeychainUtils.m to your project
  2. Add the Security.framework to your project
  3. #import <Security/Security.h> and #import "SFHFKeychainUtils.h"
like image 260
byron Avatar asked Jan 23 '11 04:01

byron


1 Answers

From my looking I don't think there is an easy way to do it. Here is an idea of what might work though:

  • create your uiwebview
  • create a nsurlrequest
  • after your webview delegate page loaded function fires look in the request's http body
  • find the form for login (regex for common login forms?)
  • retrieve give the user the option to save it and then retrieve later
like image 188
Michael Dillon Avatar answered Sep 24 '22 00:09

Michael Dillon