如何检测WKWebView中的hash变化?

Mar*_*ark 5 macos hash swift wkwebview

我有一个使用 javascript 的网站,它使用 Angular 来控制您在网站上看到的内容。因此,显示http://somewebsite.com/#page1 ,当您单击选项卡时,该位置将更改为http://somewebsite.com/#page2。网站上不会实际重新加载,因此func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)不会被触发。如何捕捉这些哈希变化?

显然 Apple 可以,因为 Safari 网络浏览器能够在地址栏中显示这些更改。


19.33 更新:

我做了一些研究。在 Safari 浏览器中使用window.onhashchange这将被触发,但在 WKWebView 中却不会。深入研究后,我使用以下 javascript 每秒返回文档位置 href。

window.setInterval(function(){ alert(document.location) }, 1000);
Run Code Online (Sandbox Code Playgroud)

在 WKWebView 中阅读该警报时,它永远不会显示位置发生变化,而在 Safari 中,您会看到http://somewebsite.com/#page1http://somewebsite.com/#page2。WKWebView 似乎不支持此功能,这非常烦人。

Mar*_*ark 1

let script = WKUserScript(source: "(function() { \"use strict\"; addEventListener(\"hashchange\", function(event) { webkit.messageHandlers.hashchangeMessageHandler.postMessage(null); }); }) ();", injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: false)

let configuration = WKWebViewConfiguration()
configuration.userContentController.add(self, name: "hashchangeMessageHandler")
configuration.userContentController.addUserScript(script)

self.webView = WKWebView(frame: CGRect.zero, configuration: configuration)
Run Code Online (Sandbox Code Playgroud)

现在您可以使用以下命令获取哈希更改后的 URL:

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    print("Received message: \(message.name): \(message.body)")
    print(self.webView.url)

}
Run Code Online (Sandbox Code Playgroud)