停止导航 WKWebview

Stop navigation WKWebview

这是我的情况:

我在 WKWebView 中有一个视图控制器。此网络视图以页面 "A" 开头。在此页面中有一些 links (href),我希望其中一些 links 必须在外部浏览器中打开。

出于这个原因,我设置了 WKWebView 委托:

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {

        if let url = webView.url?.absoluteString
        {

                if(self.isExternalURL(url))
                {
                    let urlT = URL(string: url)!
                    decisionHandler(.cancel)
                    UIApplication.shared.open(urlT, options: [:], completionHandler: nil)
                }
                else
                {
                    decisionHandler(.allow)
                }
         }
         else
         {
                decisionHandler(.allow)
         }
}

private func isExternalURL(url:String) -> Bool
{
    //......check link
}

我的问题是,如果我 select 外部 link 外部浏览器打开,但 webview 不会保留在页面 A 上,但它也会加载外部 link 同时我希望它保留在页面 A 上。

不知道为什么

您应该使用 navigationAction.request.url 而不是 webView.url

  • webView.url - 已加载 url
  • navigationAction.request.url - 新 url 加载

改变

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if let url = navigationAction.request.url?.absoluteString
    {
        if self.isExternalURL(url)
        {
            decisionHandler(.cancel)
            UIApplication.shared.open(navigationAction.request.url, options: [:], completionHandler: nil)
        }
        else
        {
            decisionHandler(.allow)
        }
    }
    else
    {
        decisionHandler(.allow)
    }
}

你可以尝试使用webView(webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!)

func webView(webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {

        if let url = navigationAction.request.url?.absoluteString
        {
            if self.isExternalURL(url)
            {
               webView.stopLoading()
                UIApplication.shared.open(navigationAction.request.url, options: [:], completionHandler: nil)
            }

        }

    }