我已经使用这个伟大教程的源代码成功地在网站 html 页面上获得了随机 HTML 的暗模式效果。
我试图在 WKWebView 上获得相同的结果。HTML 是从 API 加载的,因此我使用 WKWebView.loadHTMLString 方法。对于此示例,演示 HTML 保存在 Xcode 项目的文件中。我还在 Xcode 中添加了 2 个 javascript 文件:darkmode.min.js(这是库)和 darkmode-options.js(页面底部切换的位置和文本标签)。我认为我没有正确注入使用 WKUserScript 的 2 个脚本。显然,darkmode.min.js 必须在 darkmode-options.js 之前加载。这就是我使用 WKUserScriptInjectionTime.atDocumentStart 和 WKUserScriptInjectionTime.atDocumentEnd 的原因。
此外,当我在控制台中打印 HTML 的视图源时,它不会显示已插入的脚本。
private func initWebView() {
let html = self.demoHTML
let jsLibrary = self.darkModeLibraryJS
let jsOptions = self.darkModeOptionsJS
let webConfiguration = WKWebViewConfiguration()
let contentController = WKUserContentController()
// Libray script an document start
let userScript = WKUserScript(source: jsLibrary, injectionTime: WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: false)
contentController.addUserScript(userScript)
// Options script and document end
let optionsScript = WKUserScript(source: jsOptions, injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: false)
contentController.addUserScript(optionsScript)
webConfiguration.userContentController = contentController
self.webview = WKWebView(frame: CGRect.zero, configuration: webConfiguration)
self.webview?.navigationDelegate = self
self.view.addSubview(webview!)
self.webview!.loadHTMLString(html, baseURL: nil)
self.webview!.fillSuperview() // after view has been added as subview
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
self.chechHTML()
}
private func chechHTML() {
let script = "document.documentElement.outerHTML.toString()"
self.webview?.evaluateJavaScript(script, completionHandler: { (html, error) in
if html != nil {
print("❌: check html response", html ?? "")
}
if error != nil {
print("❌: check html with error", error ?? "")
}
})
}
项目上传到 github:https ://github.com/CristiGhn/darkmode-webview 。Xcode 项目还包含一个 darkmode.html,它可以正常工作并显示与上面的照片完全相同。
谢谢!