Iphone UIWebView是否可以保存和自动填写以前输入的表单值(例如用户名和密码)?
我正在构建一个iPhone应用程序,它只是一个现有移动站点的Iphone UIWebView是否可以保存和自动填写以前输入的表单值(例如用户名和密码)?,iphone,forms,uiwebview,autofill,Iphone,Forms,Uiwebview,Autofill,我正在构建一个iPhone应用程序,它只是一个现有移动站点的UIWebView,具有基于表单的登录。当我在iPhone Safari上登录到移动站点时,系统会提示我保存用户名/密码,然后当我稍后返回该站点时,它会自动填充 我想在UIWebView中启用相同的功能,但就我个人而言,我不知道如何实现。有什么想法吗 解决方案 按照Michael的基本模型(见公认答案),我能够完成这项工作。以下是我所做的: 设置数据 - (BOOL)webView:(UIWebView *)webView shoul
UIWebView
,具有基于表单的登录。当我在iPhone Safari上登录到移动站点时,系统会提示我保存用户名/密码,然后当我稍后返回该站点时,它会自动填充
我想在UIWebView
中启用相同的功能,但就我个人而言,我不知道如何实现。有什么想法吗
解决方案 按照Michael的基本模型(见公认答案),我能够完成这项工作。以下是我所做的: 设置数据
- (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];
}
}
}
获取数据
- (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的绝妙软件包将敏感数据存储到iOs密钥链
为了使SFHFKeychainUtils正常工作,您需要做以下几件事:
SFHFKeychainUtils.h
和SFHFKeychainUtils.m
添加到项目中Security.framework
添加到项目中#导入
和#导入“SFHFKeychainUtils.h”
从我看来,我不认为有一个简单的方法来做这件事。以下是一个可能有效的想法:
- 创建您的uiwebview
- 创建一个nsurlrequest
- webview委托页面加载函数启动后,查看请求的http正文
- 查找登录表单(常用登录表单的regex?)
- retrieve为用户提供保存它的选项,然后在以后检索
@“document.getElementById('username').value”
和@“document.getElementById('password').value”
才能让它工作。希望这有帮助!如果您使用嵌入式UIWebview登录每个网站时,每个应用程序都可以检索您的用户名/密码,那么这是一个非常严重的漏洞吗?@rptwsthi我知道。我想把迈克尔的回答归功于他,因为他给了我最终解决问题的途径。