簡體   English   中英

觀察WKWebview的backForwardList變化

[英]Observe backForwardList changes of WKWebview

為了解釋我的問題,我想從我項目的基礎開始。

我們正在構建一個應用程序,它使用 web 視圖加載許多不同的網站(網絡應用程序)以形成我們的應用程序 package。這些 web 應用程序是使用不同的 web 技術制作的,例如 ruby 或 ember/react(單頁 883869585086)。 后來通過push state更改 url,這對於 webviews WKNavigationDelegate是有問題的,因為它不識別任何 url 更改。 如果您加載正常的 http 請求(如舊的 Rails 頁面),那么一切都很好。

為了隨時了解用戶在哪個頁面上,我創建了一個用戶腳本,該腳本利用pushsstate js prototype並將 url 更改發回給 iOS 應用程序,盡管這是一個解決方案,但在我看來它非常 hacky。 所以我一直在尋找替代方案,我遇到了WKWebView.backForwardList ,它實際上記錄了所有這些推送 state 更改。

我現在遇到的問題是如何監視/觀察backForwardList中的變化,讓我們說currentItem 您不能使用 KVO 這樣做,因為這些屬性不支持它。

然而,我確實通過觀察webview.scrollView.contentSize找到了一個可能的解決方案,由於某種原因,每次屏幕上的某些內容發生變化時都會觸發。 奇怪的是,對於在屏幕上運行的每一個 animation,這個觀察者都會被觸發,這幾乎就像它調用滾動視圖的像素變化一樣。 我們的 web 應用程序在使用 canvas 游戲元素構建時一直處於動畫狀態,這意味着觀察者會被調用很多,而且一直運行它會讓人不舒服。

你知道更好/更簡潔的方法來跟蹤WKWebView.backForwardList項目的變化嗎?

干杯托馬斯

我找到了看起來很明顯但當時不是的解決方案

// Add observation.
urlObservation = webView?.observe(\.url, changeHandler: { (webView, change) in
      print("Web view URL changed to \(webView.backForwardList.currentItem?.url.absoluteString ?? "Empty")", webView.scrollView.contentSize.width, webView.scrollView.contentSize.height)
})

這似乎跟蹤 url 更改,即使導航委托未以任何方式觸發。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM