Остановить навигацию WKWebview - PullRequest
1 голос
/ 30 мая 2019

Это моя ситуация:

У меня есть контроллер представления в WKWebView.Это веб-представление начинается со страницы «А».На этой странице есть некоторые ссылки (href), и я хочу, чтобы некоторые из этих ссылок открывались во внешнем браузере.

По этой причине я установил делегат 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
}

Моя проблема в том, что если я выберу внешнюю ссылку, откроется внешний браузер, но веб-просмотр не останется на странице A, но он также загрузит внешнюю ссылку, хотя я хотел бы, чтобы она оставалась на странице A.

Iне знаю почему

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Вы должны использовать 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)
    }
}
0 голосов
/ 30 мая 2019

Вы можете попробовать использовать 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)
            }

        }

    }
...