UIWebView是否可以保存和自动填写以前input的表单值(例如,用户名和密码)?
我正在构build一个iPhone应用程序,它只是一个基于表单login的现有移动网站的UIWebView
。 当我在iPhone Safari上login到移动网站时,系统会提示我保存用户名/密码,然后在稍后返回网站时自动填充。
我想在UIWebView
启用相同的function,但在我的生活中,我无法弄清楚如何做到这一点。 有任何想法吗?
解
遵循迈克尔的基本模型(见接受的答案),我能够完成这个工作。 以下是我所做的:
设置数据
- (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]; } }
获取数据
- (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]; } } }
请注意,我正在使用Buzz Andersen的令人敬畏的SFHFKeychainUtils软件包来将敏感数据存储到iOs Keychain。
为了获得SFHFKeychainUtils的工作,你需要做一些事情:
- 将
SFHFKeychainUtils.h
和SFHFKeychainUtils.m
添加到您的项目中 - 将
Security.framework
添加到您的项目 -
#import <Security/Security.h>
和#import "SFHFKeychainUtils.h"
从我看,我不认为有一个简单的方法来做到这一点。 这是一个什么可能工作的想法:
- 创build你的uiwebview
- 创build一个nsurlrequest
- 在您的webview委托页面加载函数触发请求的http身体
- findlogin表单(通用login表单的正则expression式?)
- 检索给用户选项来保存它,然后再检索