首页 文章

在UIWebView中自动填充用户名和密码

提问于
浏览
5

我正在为我做一个非常简单的应用程序 . 当我启动这个应用程序时,它只是带我到这个网页https://social.tre.it/expert .

我想自动登录,所以有没有办法自动填写用户名和密码,检查“我接受条件”标记并按“登录”按钮?

我试过这个Autofill Username and Password UIWebView Swift但它不是页面的创建者所以我不是't know exactly how it'的结构 .

即使iCloud钥匙链填写表格也会很酷......但也许我问的太多了!

1 回答

  • 10

    您可以使用JavaScript来执行此操作 .

    如果您检查页面,您可以很容易地找到文本输入字段的ID( expert_emailexpert_password )并执行一些JS代码来填充它们 .

    像这样实现 UIWebView 委托的 webViewDidFinishLoad 方法:

    OBJECTIVE-C:

    - (void)webViewDidFinishLoad:(UIWebView *)webView {
        //fill data
        NSString *email = @"myemail@email.com";
        NSString *password = @"mypassword";
        NSString *fillDataJsCall = [NSString stringWithFormat:@"document.getElementById('expert_email').value = '%@';document.getElementById('expert_password').value = '%@';", email, password];
        [webView stringByEvaluatingJavaScriptFromString:fillDataJsCall];
    
        //check checkboxes
        [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('expert_remember_me').checked = true; document.getElementById('expert_terms_of_service').checked = true;"];
    
        //submit form
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^(void)
        {
           [webView stringByEvaluatingJavaScriptFromString:@"document.forms[\"new_expert\"].submit();"];
        });
    }
    

    SWIFT:

    func webViewDidFinishLoad(webView: UIWebView) {
    
        // fill data
        let savedUsername = "USERNAME"
        let savedPassword = "PASSWORD"
    
        let fillForm = String(format: "document.getElementById('expert_email').value = '\(savedUsername)';document.getElementById('expert_password').value = '\(savedPassword)';")
        webView.stringByEvaluatingJavaScriptFromString(fillForm)
    
        //check checkboxes
        webView.stringByEvaluatingJavaScriptFromString("document.getElementById('expert_remember_me').checked = true; document.getElementById('expert_terms_of_service').checked = true;")
    
         //submit form
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(1 * NSEC_PER_SEC)), dispatch_get_main_queue()){
            webView.stringByEvaluatingJavaScriptFromString("document.forms[\"new_expert\"].submit();")
        }
    }
    

    这应该填写您的信息 . 但是,如果此网站将来更改其结构,则此代码很容易破解 . 当您处理自己的页面时,这种执行JS代码的方法更合理 .

    Edit:

    我更新了代码以演示如何选中复选框以及如何提交表单 .

    一些说明:

    • 当登录失败时,页面被重新加载,所以你最终会得到一个无限循环的 webViewDidFinishLoad 调用,因为你为什么我在提交之前提出了一个延迟,以便能够看到发生了什么 .

    • 除了上一点中的信息之外 - 在登录成功后(当重定向到下一页时)你仍然会收到 webViewDidFinishLoad 的电话,所以你可能想在一个不同的页面加载时提出一个标志(执行登录)仅在登录页面上尝试) .

相关问题