我不是 android 人,来自 iOS 世界,Webviews 根本不安全。在 iOS 中,您绝对可以将 javascript 注入WKWebKit. 在这里,我准备了一个演示。
import UIKit
import WebKit
class ViewController: UIViewController {
private var webView: WKWebView?
private var url = URL(string: "https://m.facebook.com/")!
private var domInputFieldId = "m_login_password"
override func viewDidLoad() {
super.viewDidLoad()
initializeWebView()
loadData()
}
private func initializeWebView() {
let javascript = """
window.onload = function() {
var passField = document.getElementById("\(domInputFieldId)");
passField.addEventListener("input", function(evt) {
window.webkit.messageHandlers.jsMessenger.postMessage("\(domInputFieldId): " + passField.value.toString());
});
window.webkit.messageHandlers.jsMessenger.postMessage("Window loaded");
}
window.webkit.messageHandlers.jsMessenger.postMessage("Script sent first message");
"""
let userScript = WKUserScript.init(source: javascript,
injectionTime: .atDocumentStart, forMainFrameOnly: true)
let contentController = WKUserContentController()
contentController.addUserScript(userScript)
contentController.add(self, name: "jsMessenger")
let config = WKWebViewConfiguration()
config.userContentController = contentController
webView = WKWebView(frame: view.frame, configuration: config)
webView?.navigationDelegate = self
view.addSubview(webView!)
}
private func loadData() {
webView?.load(URLRequest.init(url: url))
}
}
extension ViewController: WKNavigationDelegate {
public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
print("WKWebView Delegate let me know, that it's done loading")
}
}
extension ViewController: WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print(message.body)
}
}
我所做的一切都是用 id 监听 DOM(文档对象模型)子节点m_login_password,并将其传递给我的应用程序。
输出
