Ios 检测每次WKWebView完成加载的时间

Ios 检测每次WKWebView完成加载的时间,ios,swift,wkwebview,Ios,Swift,Wkwebview,我有一个在iPad上的iOS8上运行的WKWebView应用程序(标准的iPad用户代理:“Mozilla/5.0(iPad;CPU OS 8_1_1,类似Mac OS X)AppleWebKit/600.1.4(KHTML,类似Gecko)版本/8.0 Mobile/12B436 Safari/600.1.4”)。我尝试了我能想到的所有代理和侦听器,每次都尝试检测页面何时完成加载。问题是: 打开您的WKWebView并转到Google。以下称为: _decidePolicyForNavigat

我有一个在iPad上的iOS8上运行的WKWebView应用程序(标准的iPad用户代理:“Mozilla/5.0(iPad;CPU OS 8_1_1,类似Mac OS X)AppleWebKit/600.1.4(KHTML,类似Gecko)版本/8.0 Mobile/12B436 Safari/600.1.4”)。我尝试了我能想到的所有代理和侦听器,每次都尝试检测页面何时完成加载。问题是:

  • 打开您的WKWebView并转到Google。以下称为:

    _decidePolicyForNavigationAction
    _didStartProvisionalNavigation
    _ didFinishNavigation
    
    _didStartProvisionalNavigation
    _decidePolicyForNavigationAction
    _ didFinishNavigation
    
  • 在Google中键入“YouTube”: 只调用_decidePolicyForNavigationAction。没有didStartProvisionalNavigation或didFinishNavigation

  • 点击谷歌内部的YouTube。以下称为:

    _decidePolicyForNavigationAction
    _didStartProvisionalNavigation
    _ didFinishNavigation
    
    _didStartProvisionalNavigation
    _decidePolicyForNavigationAction
    _ didFinishNavigation
    
  • 从现在起,在YouTube中没有任何东西被称为。点击YouTube视频,没有didStartProvisionalNavigation或didFinishNavigation。此外,不再调用webview.loading observer。甚至decidePolicyForNavigationAction也只是偶尔被调用。但是,webView.backForwardList.currentItem在每次单击后都会更新,因此必须检测页面何时完成加载

  • 这种行为也发生在许多其他网站上(例如Vimeo)。我知道这种类型的站点不会每次都更新主框架,但这是否缺乏检测加载何时开始/完成WKWebView在其当前状态下的“限制”的能力

    我想实现的是:是否有另一种方法可以检测每次在YouTube/Vimeo等Java移动网站中导航何时完成:

    • 使用NSURL协议或类似协议
    • 或者是一种检测何时 webView.backForwardList.currentItem是否已更新

    感谢您的帮助。

    我不确定加载页面后您到底想做什么,但希望观察这些属性可以帮助您:

    webView.addObserver(self, forKeyPath: "estimatedProgress", options: .New, context: nil)
    webView.addObserver(self, forKeyPath: "loading", options: .New, context: nil)
    webView.addObserver(self, forKeyPath: "title", options: .New, context: nil)
    webView.addObserver(self, forKeyPath: "canGoBack", options: .New, context: nil)
    webView.addObserver(self, forKeyPath: "canGoForward", options: .New, context: nil)
    

    如果有人在寻找如何使用观察者的解决方案,以下是解决方案:

    webView.addObserver(self, forKeyPath: "title", options: .new, context: nil);
    webView.addObserver(self, forKeyPath: "loading", options: .new, context: nil);
    webView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil);
    
    然后使用
    observeValue
    功能并编写一个开关盒,或者如果需要,则查找
    键路径

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "title" {
            print(change ?? "No title")
            if change != nil, let currentTitle = change?[.newKey] as? String {
                titleLabel.text = currentTitle
            }
        } else if keyPath == "loading" {
            print("Loading")
            reloadButton.setImage(#imageLiteral(resourceName: "cancel.png"), for: .normal)
        } else if keyPath == "estimatedProgress" {
            print(wkWebView.estimatedProgress);
            progressView.progress = Float(wkWebView.estimatedProgress)
        }
    }
    

    我创建了一个演示项目,以探索有关WebKit WebView的更多信息。

    签出我使用WebView.scrollView.contentSize属性来检查高度,如果高度为零,则我会在设置之前稍微延迟调用相应的函数。谢谢,但我并不想检测WKWebView何时出现在屏幕上——我希望WKWebView在只使用Java的网站(YouTube mobile、Vimeo mobile等)开始和结束在iPhone上加载其网站内的点击时通知我。一旦YouTube加载到iPhone上,WKWebView就不会调用任何东西。。。您可以继续浏览站点,并且不会调用任何委托方法。web视图的问题是,对于您无法控制的站点(因此可以在其中插入特定的事件挂钩),一旦您开始尝试一般性地确定“完成加载”的概念,就很难定义它。在页面中加载和运行Javascript,就像现代复杂网站的典型情况一样,可以通过非页面请求下拉内容,然后在原始HTML及其资源完全下载并构建DOM后填充页面。这就是你在YT和Vimeo中看到的。从技术上讲,该页面在任何地方都无法导航。swift中的现成解决方案:这是唯一对我有效的方法——对estimatedProgress作出反应。有时也会调用jquery ready,即使wkwebview进度不是1,文档显然仍在加载中。是否有基于上述观察者触发方法的演示代码?非常感谢;这对我帮助很大!但为了完全可靠,我必须在观察到的关键路径列表中添加“URL”!