swift - 使用swift 4自动登录网页
问题描述
我的应用程序中有一个 WkWebView,它将用户带到第三方网页,他们必须登录才能访问相关信息。应用程序的所有用户使用相同的预共享登录详细信息(应用程序由企业分发给少数人管理)。
我希望应用程序自动填写用户名和密码详细信息,然后在没有用户输入的情况下提交所有内容。我一直在这里查看很多帖子并尝试使用 webViewDidFinishLoad 发出帖子请求,但到目前为止还没有运气。大多数信息是关于存储和调用用户详细信息,而不是预先共享的用户名和密码。
任何指向正确方向的帮助都会很棒。
当前仅用于加载网站的代码是:
导入 UIKit 导入 WebKit
class TreliskeWeatherViewController: UIViewController, WKUIDelegate {
var webView: WKWebView!
override func loadView() {
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.uiDelegate = self
webView.navigationDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
let treliskeWeather = URL(string: " ")
let myRequest = URLRequest(url: treliskeWeather!)
webView.load(myRequest)
}
}
extension TreliskeWeatherViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
print("Finished navigating to url")
}
}
解决方案
一旦 webview 完成加载,您就可以评估 javascript 文件。我在javascript中使用超时和间隔逻辑只是为了确保元素存在。我在这里只检查登录按钮,但如果你愿意,你可以检查所有三个。
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
guard let jsFile = Bundle.main.url(forResource: "injectCredentials", withExtension: "js") else {
return
}
do {
let injectJS = try String(contentsOf: jsFile)
let formatted = String(format: injectJS, "username", "password")
webView.evaluateJavaScript(formatted) { (value, error) in
//
}
} catch {
//
}
}
injectCredentials.js
var timeoutSeconds = 30;
var username = "%@";
var password = "%@";
var checkLogin = setInterval(checkLoginFields, 1000);
setTimeout(function() {
clearInterval(checkLogin);
}, timeoutSeconds * 1000);
function checkLoginFields() {
var usernameInput = document.getElementById('username');
var passwordInput = document.getElementById('password');
var signInButton = document.getElementById("login");
if (signInButton == null) {
return;
}
usernameInput.value = username;
passwordInput.value = password;
signInButton.click();
clearInterval(checkLogin);
}
推荐阅读
- python - 用他们以前的项目替换列表中的每个项目?
- keras - 如何在 Keras 中实现多类多标签分类
- reactjs - 如何使用 React Developer Tools 扩展来检查我自己的 chrome 扩展(一个反应应用程序)?
- reactjs - NEXTJS 传递给 hook props 并接收 redux 动作
- javascript - 第一列滚动和表格过滤功能不同步
- datetime - Flask - Flask-Moment 给出错误:AttributeError: 'str' object has no attribute 'strftime'
- django - 从 request.FILES Django 上传到 S3
- ios - 处理集合视图分页的第一页和最后一页?
- javascript - 我们是否必须在单独的文件中生成 Angular Web Workers?
- python - 使用 python-telegram-bot 将(电报机器人用户)的实时位置发送给其他用户