【问题标题】:Tracking navigation in WKWebView doesn't work for button clickWKWebView 中的跟踪导航不适用于按钮单击
【发布时间】:2020-11-21 08:39:44
【问题描述】:

我试图在我的 web 视图中捕捉按钮点击。如果我可以这样说,按钮“动作”会触发某些 url……我无法通过 WKNavigationDelegate 捕捉到这一刻。 webview 是这样设置的:

 lazy var advertWebKitView: WKWebView = {
        let webConfiguration = WKWebViewConfiguration()
        let preferences = WKPreferences()
        preferences.javaScriptEnabled = true
        webConfiguration.preferences = preferences
        let webView = WKWebView(frame: .zero, configuration: webConfiguration)

        webView.navigationDelegate = self
        webView.uiDelegate = self
        webView.translatesAutoresizingMaskIntoConstraints = false
        return webView
    }()

我正在尝试像这样捕捉该按钮的点击:

 func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        decisionHandler(.allow)
        guard let urlAsString = navigationAction.request.url?.absoluteString.lowercased() else {
            return
        }
        
        if urlAsString.range(of: "...") != nil {
           
        }
    }

但是当按钮被点击时这个方法不会触发。

在 android 上,它的工作原理是这样的:

@Override
        public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
            if (url.equals("...")) {
                finish();
            }
             //...
            super.doUpdateVisitedHistory(view, url, isReload);
        }

通过 wkwebview 正确跟踪导航的方法和方法是什么?

编辑: 如果需要有关网页结构的一些信息,请询问详细信息,我也会添加。我只是不知道哪些信息可能相关或有用。

按钮 html 如下所示:

<a class="lc-button lc-button--light" href="/close">OK</a>

另外一件有趣的事情是,我尝试在其他网站上使用我的代码,并且导航委托方法被正确触发。这导致我发现问题出在我们的网站及其 html 代码或单击按钮后页面如何加载的问题上,也许......

【问题讨论】:

  • 这能回答你的问题吗? How to detect a click event in a UIWebView
  • @KirilS。它没有帮助导致它关于 UIWebView,而不是 WKWebView。
  • 请在 Web UI 中显示按钮的代码及其操作。
  • @SanthoshR 目前我只有按钮 html 代码。我想帮助不大,但如果需要更多信息,关于他们在 FE 上使用了什么技术,以及如何重新加载/加载页面,我可以在明天为您提供。
  • 您是否尝试将decisionHandler(.allow) 移动到函数末尾?也许也可以尝试使用委托函数func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)

标签: ios swift wkwebview swift5


【解决方案1】:

我自己在使用它,它可以工作,它与您到目前为止尝试的方法略有不同,但与 Android 方法等效。

 func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if let requestURL = navigationAction.request.url, requestURL.pathComponents.contains("...") {
//Do your things 
            decisionHandler(.cancel)
            return
        }
        decisionHandler(.allow)
    }

【讨论】:

  • 问题是委托方法根本不会启动,所以无论我放在那里,在这种情况下都没有关系。我们也解决了这个问题......这是前端的事情......他们用 myserverurl/close"> 更改了到达路由器 ... 并且它起作用了。我真的不知道它为什么起作用,但它起作用了。
【解决方案2】:

在反应路由器中使用 RedirectTo 而不是 LinkTo 来重定向到 /close

【讨论】:

【解决方案3】:

viewDidLoad 中的第一组委托,

self.webView.navigationDelegate = self

您可以通过实现来捕捉按钮将您导航到的位置 WKNavigationDelegate 函数,didFinish navigation

extension YourViewController: WKNavigationDelegate{
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        if let currentURL = webView.url{
            if self.urlString == currentURL.absoluteString{
                  print(self.urlString)
            }
        }
    }
}

【讨论】:

  • 正如我所说的,所有这些都实现了,但没有触发任何方法。
  • @Whirlwind 我已经更新了答案,请再次查看答案,您设置导航委托了吗?
  • 一切就绪,导航委托已设置。问题也解决了,是我们网站的问题。
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
相关资源
最近更新 更多