最近使用 WKWebView 嵌入网页,需要在页面中注入 js,记录一下遇到的坑。

修改 user-agent


let webView = WKWebView()
let customUA = "customUA"
webView.evaluateJavaScript("navigator.userAgent") {[weak self] (data, error) in
	if let oldUA = data as? String {
		self?.webView.customUserAgent = "\(oldUA) \(customUA)"
	}
}

user-agent 可以在初始化后修改,效果可持续在 webview 的整个生命周期

在 window 上注入 js

在网页加载完成时需要注入一个 initData,通知页面是在 App 中显示:


let webView = WKWebView()
webView.evaluateJavaScript("window.initData = { 'env' : 'app' }") {(data, error) in

}

当第一次加载时页面运行正常,但当调用 webView.load(URLRequest) 加载其他新页面时,之前注入的 js 就无效了(因为页面已经刷新),查了资料,经过测试,发现如果是和页面有关的 js 注入,需要放到 didCommit 中来执行:


func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
	webView.evaluateJavaScript("window.initData = { 'env' : 'app' }") {(data, error) in

	}
}

这样就能在每次加载新页面时都及时注入 js 了。