UIWebView 是不是可以保存和自动填充以前输入的表单值(例如,用户名和密码)?

Posted

技术标签:

【中文标题】UIWebView 是不是可以保存和自动填充以前输入的表单值(例如,用户名和密码)?【英文标题】:Is it possible for a UIWebView to save and autofill previously entered form values (e.g., username & password)?UIWebView 是否可以保存和自动填充以前输入的表单值(例如,用户名和密码)? 【发布时间】:2011-01-23 04:38:19 【问题描述】:

我正在构建一个 iPhone 应用程序,它只是具有基于表单登录的现有移动网站的UIWebView。当我在 iPhone Safari 上登录移动网站时,系统会提示我保存我的用户名/密码,然后当我稍后返回该网站时会自动填充。

我想在UIWebView 中启用相同的功能,但对于我来说,我不知道该怎么做。有什么想法吗?


解决方案

按照迈克尔的基本模型(请参阅接受的答案),我能够完成这项工作。这是我所做的:

设置数据

- (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 钥匙串。

为了让 SFHFKeychainUtils 正常工作,您需要做一些事情:

    SFHFKeychainUtils.hSFHFKeychainUtils.m 添加到您的项目中 将Security.framework 添加到您的项目中 #import <Security/Security.h>#import "SFHFKeychainUtils.h"

【问题讨论】:

此代码是否仅适用于您尝试加载的特定网站?我也一直在尝试为我的应用解决这个问题;但我的问题有点复杂,因为我的应用程序中有大约 5 个不同的链接,我希望它可以保存密码。我尝试了您在上面所做的事情,但我无法让任何网站打印出您在 webView 委托方法中收到的用户名。有什么建议吗? @ryan,您是否已确认您实际上在每个表单的初始表单提交中正确存储了数据?另外,在检索时仔细检查表单名称......我有一个很难看到的拼写错误,这让我有些头疼。 非常感谢您发布您的解决方案 (+1)!我必须使用@"document.getElementById('username').value"@"document.getElementById('password').value" 才能让它工作。希望这会有所帮助! 当您使用嵌入式 UIWebview 登录每个网站时,如果每个应用程序都可以检索您的用户名/密码,这是一个非常严重的漏洞吗? @rptwsthi 我知道。我想感谢迈克尔的答案,因为他为我提供了最终解决方案的途径。 【参考方案1】:

从我看来,我认为没有简单的方法可以做到这一点。以下是可能工作的想法:

创建您的 uiwebview 创建一个 nsurlrequest 在您的 webview 委托页面加载函数触发后,查看请求的 http 正文 查找登录表单(常用登录表单的正则表达式?) retrieve 让用户可以选择保存并稍后检索

【讨论】:

迈克尔,谢谢。我遵循了这个基本模型并且能够使其工作。一旦我测试更多,我会更新更多细节。 好毅力!我不确定您如何保存用户的数据,但一定要查看苹果文档以获取有关如何执行此操作的建议/要求。我不太熟悉。 如果每个网页都需要这个,哪个用户访问?我还能根据之前输入的值显示建议吗?例如,如果用户访问 gmail 并输入一些电子邮件 ID,下次他再次访问 gmail 页面时,我如何向他显示之前输入的电子邮件 ID 作为建议? @拜伦

以上是关于UIWebView 是不是可以保存和自动填充以前输入的表单值(例如,用户名和密码)?的主要内容,如果未能解决你的问题,请参考以下文章

谷歌自动填充问题???

自动填充 UIWebView

解决Google浏览器保存密码自动填充

我可以使用 UIWebView (iOS) 自动登录 youtube 吗?

UIWebView -stringByEvaluatingJavaScriptFromString:在 iFrame 内容中填充文本框?

自动布局不是那么自动