iOS WebKit - определите, полностью ли загружен JS-контент в WebView - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь проанализировать некоторые метаданные HTML из стороннего URL;однако, я не получаю полные данные HTML, пока некоторые сценарии Javascript не будут выполнены в WKWebView.

Так что я пытался определить, когда WKWebView полностью загрузил веб-страницу с Javascriptно, к сожалению, я не смог.

Вот что я попробовал:

  • Я попытался использовать WKUserContentController и обработал метод протокола, но это не сработало, потому что метод протоколавыполняется только тогда, когда он получает сообщение сценария, а не после его завершения.
  • Я попытался добавить наблюдателя для WKWebView estimatedProgress, но estimatedProgress вернул 1,0 до завершения загрузки сценариев JS.
  • Я пытался использовать WKNavigationDelegate метод протокола webView(_ webView: WKWebView, didFinish navigation: WKNavigation!), но это по сути то же самое, что и добавление наблюдателя.
  • Я также пытался использовать метод WKWebView evaluateJavaScript в методе observeValueчтобы проверить оба:
    • document.readyState == \"interactive\"
    • document.readyState == \"completed\"

, но это тоже не сработало, потому что оно выполнялось до JSзагрузка завершена.

код

ВотОда последнего подхода, который я пытался и не работал:

Инициализация WKWebView

        let webView = WKWebView(frame: self.view.frame)
        webView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
        webView.load(URLRequest(url: url))
        webView.navigationDelegate = self
        self.view.addSubview(webView)

Обработка наблюдателя

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == "estimatedProgress" {
        if let webView = object as? WKWebView, webView.estimatedProgress > 0.5 {
            print(webView.estimatedProgress)
            webView.evaluateJavaScript("document.readyState == \"interactive\"") { (isLoaded, err) in
                print(isLoaded)
                if let loaded = isLoaded as? Bool, loaded == true {
                    print("completely done loading with JS")
                }
            }
        }
    }
}

Результат, который я получаю при выполнении метода evaluateJavaScript, равен false, потому что он выполняется слишком рано.Но я пытаюсь позволить наблюдателю продолжать, пока isLoaded не станет правдой.

1 Ответ

0 голосов
/ 23 декабря 2018

Чтобы проверить, загружен ли ваш WKWebView:

import WebKit
import UIKit

class ViewController: UIViewController, WKNavigationDelegate {

  let webView = WKWebView()

  override func viewDidLoad() {
    super.viewDidLoad()
    let url = URL(string: "https://www.yourwebsite.com/") !
    let request = URLRequest(url: url)
    webView.navigationDelegate = self
    webView.load(request)
  }

func webView(_ webView: WKWebView, didStart navigation: WKNavigation!) {
    print("Strat to load")
}

  func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
     print("loaded")
     //It will print "loaded" in the console everytime the WKWebView has finished loading the page. 
  }
}

Но это для каждого ресурса, а не для всей страницы со всеми ресурсами.Взгляните на https://stackoverflow.com/a/43172313/3857830

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...