ios 如何在WKWebView中检测history.pushstate

jxct1oxe  于 2023-05-30  发布在  iOS
关注(0)|答案(2)|浏览(183)

我用Swift开发了一个混合iOS应用程序,想在WKWebView中检测history.pushstate()。我确实覆盖了WKWebView的方法,但我什么也检测不到。
有没有一种方法或技巧来检测历史记录。pushstate()

e0uiprwp

e0uiprwp1#

这当然是一种解决方法,但如果你被允许编辑内置对象的属性(就像在大多数浏览器中一样),你可以 Package 这两个函数,并使用拦截处理程序来跟踪它们何时被调用:

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')
yc0p9oo0

yc0p9oo02#

您可以通过key-value observing观察WKWebView.url

var urlObservation: NSKeyValueObservation?

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

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

相关问题