首页 文章

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

提问于
浏览
34

我正在构建一个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];

        }
    }   
}

请注意,我将'm using Buzz Andersen'包用于将敏感数据存储到iOs Keychain .

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

  • SFHFKeychainUtils.hSFHFKeychainUtils.m 添加到您的项目中

  • Security.framework 添加到项目中

  • #import <Security/Security.h>#import "SFHFKeychainUtils.h"

1 回答

  • 4

    从我看来,我不认为有一个简单的方法来做到这一点 . 这里有一个可能有用的想法:

    • 创建你的uiwebview

    • 创建一个nsurlrequest
      在webview委托页面加载函数fires之后

    • 查看请求的http主体

    • 找到登录表单(普通登录表单的正则表达式?)

    • retrieve为用户提供保存选项,然后再检索

相关问题