Swift 如何检测WKWebView中的哈希更改?

Swift 如何检测WKWebView中的哈希更改?,swift,macos,hash,wkwebview,Swift,Macos,Hash,Wkwebview,我有一个使用javascript的网站,它使用angular来控制你在网站上看到的内容。因此,当您单击位置更改为的选项卡时,会显示。网站上不会实际重新加载,因此不会触发func-webView(\uwebview:WKWebView,didfish-navigation:WKNavigation!)。如何捕获这些散列更改 显然苹果可以,因为SafariWebBrowser能够在位置栏中显示这些变化 更新19.33: 我做了一些调查。在Safari浏览器中使用window.onhashchang

我有一个使用javascript的网站,它使用angular来控制你在网站上看到的内容。因此,当您单击位置更改为的选项卡时,会显示。网站上不会实际重新加载,因此不会触发
func-webView(\uwebview:WKWebView,didfish-navigation:WKNavigation!)
。如何捕获这些散列更改

显然苹果可以,因为SafariWebBrowser能够在位置栏中显示这些变化


更新19.33:

我做了一些调查。在Safari浏览器中使用
window.onhashchange
会触发此操作,但在WKWebView中不会触发。我使用以下javascript每秒返回一次文档位置href

window.setInterval(function(){ alert(document.location) }, 1000);
在WKWebView中读取该警报时,它不会显示位置更改,而在Safari中,您会看到和。看起来WKWebView不支持这个非常烦人的功能

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)
现在,您可以通过以下方式获取哈希更改的URL:

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

}

不需要注入任何JS。我使用了
webView.addObserver(self,forKeyPath:“URL”,options:.new,context:nil)
,这是在检测任何URL更改,包括哈希更改。然后:

override func observeValue(
    forKeyPath keyPath: String?,
    of object: Any?,
    change: [NSKeyValueChangeKey: Any]?,
    context: UnsafeMutableRawPointer?) {
  if object as AnyObject? === webView && keyPath == "URL" {
    onURLChange(webView.url) // onURLChange does whatever you want
  }
}

别忘了
webView。在
deinit
块中移除观察者(self,forKeyPath:“URL”)

你找到解决方案了吗?`我也面临着同样的问题回答!谢谢,这应该是公认的答案。