如何在WKWebView中检测history.pushstate

6

我使用Swift开发了混合iOS应用程序,想要在WKWebView中检测history.pushstate()。我尝试重写WKWebView的方法,但是没有检测到任何内容。

有没有什么方法或技巧可以检测history.pushstate()


你所说的“override”是什么意思? - gyre
@gyre 这意味着我使用了“func webView(blah blah blah)”。 - hoi
2个回答

3

这确实是一个解决方法,但如果您可以编辑内置对象的属性(像大多数浏览器中那样),您可以包装两个函数并使用拦截处理程序来跟踪它们何时被调用:

function track (fn, handler) {
  return function interceptor () {
    handler.apply(this, arguments)
    return fn.apply(this, arguments)
  }
}

history.pushState = track(history.pushState, function (state, title, url) {
  // do something with `state, `title`, and `url`
  console.log('pushState called with:', { state: state, title: title, url: url })
})


history.replaceState = track(history.replaceState, function (state, title, url) {
  // do something with `state, `title`, and `url`
  console.log('replaceState called with:', { state: state, title: title, url: url })
})

history.pushState(null, 'Title 1', '/example-page')


2
你可以通过键值观察来观察WKWebView.url
var urlObservation: NSKeyValueObservation?

...
let webView = WKWebView(...)
urlObservation = webView.observe(\.url, changeHandler: { webView, change in
    print("url changed")
})

看起来Firefox for iOS也在使用这种方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接