Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UIWebView是否可以保存和自动填写以前输入的表单值(例如用户名和密码)?_Iphone_Forms_Uiwebview_Autofill - Fatal编程技术网

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

Iphone UIWebView是否可以保存和自动填写以前输入的表单值(例如用户名和密码)?,iphone,forms,uiwebview,autofill,Iphone,Forms,Uiwebview,Autofill,我正在构建一个iPhone应用程序,它只是一个现有移动站点的UIWebView,具有基于表单的登录。当我在iPhone Safari上登录到移动站点时,系统会提示我保存用户名/密码,然后当我稍后返回该站点时,它会自动填充 我想在UIWebView中启用相同的功能,但就我个人而言,我不知道如何实现。有什么想法吗 解决方案 按照Michael的基本模型(见公认答案),我能够完成这项工作。以下是我所做的: 设置数据 - (BOOL)webView:(UIWebView *)webView shoul

我正在构建一个iPhone应用程序,它只是一个现有移动站点的
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为用户提供保存它的选项,然后在以后检索

    迈克尔,谢谢。我遵循了这个基本模型,并且能够使它工作。我会更新更多的细节,只要我测试多一点。很好的毅力!我不确定您是如何保存用户数据的,但一定要查看apple文档,了解如何保存用户数据的建议/要求。我对这个不太熟悉。如果我每个网页都需要这个怎么办,哪个用户访问?我仍然可以根据以前输入的值显示建议。例如,如果用户访问gmail并输入一些电子邮件id,下次他再次访问gmail页面时,我如何向他显示以前输入的电子邮件id作为建议@Byroni此代码是否仅适用于您尝试加载的特定网站?我也一直在尝试为我的应用程序解决这个问题;但我的问题有点复杂,因为我的应用程序中有5个不同的链接,我希望它保存密码。我尝试了您在上面所做的操作,但我无法让任何网站打印出您在webView委托方法中收到的用户名。有什么建议吗?@ryan,您是否验证了您在每个表单的初始表单提交中是否正确存储了数据?另外,在检索时再次检查表单名称…我有一个很难看到的拼写错误,这让我很头疼。非常感谢您发布您的解决方案(+1)!我必须使用
    @“document.getElementById('username').value”
    @“document.getElementById('password').value”
    才能让它工作。希望这有帮助!如果您使用嵌入式UIWebview登录每个网站时,每个应用程序都可以检索您的用户名/密码,那么这是一个非常严重的漏洞吗?@rptwsthi我知道。我想把迈克尔的回答归功于他,因为他给了我最终解决问题的途径。