Остановить навигацию WKWebview
Это моя ситуация:
У меня есть контроллер представления в 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.
Я не знаю почему
2 ответа
Решение
Вы должны использовать navigationAction.request.url
вместо webView.url
webView.url
- Уже загруженный URLnavigationAction.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)
}
}
}