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?
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:
SFHFKeychainUtils.h
and SFHFKeychainUtils.m
to your projectSecurity.framework
to your project#import <Security/Security.h>
and #import "SFHFKeychainUtils.h"
From my looking I don't think there is an easy way to do it. Here is an idea of what might work though:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With