首页 > 解决方案 > 使 WKWebView 中的某些链接在 Safari 中打开,而不是 Webview

问题描述

我有一个 WebView 应用程序,其中包含我希望用户在 Safari 中打开的外部链接,而不是 webview 本身,点击。我相信它与导航委托有关,但我是 iOS 开发的新手,不知道从哪里开始!下面是我今天的代码。如果您能具体告诉我要进行哪些更改以及将任何代码放入何处,那将使我的生活变得更加轻松。提前感谢大家的帮助!我认为有一种方法可以设置导航委托,以便所有以https://example-root.com/开头的 URL在 web 视图中正常打开,因为它们是本机导航按钮,但我想打开所有其他 URL在野生动物园中。

import UIKit
import WebKit


class ViewController: UIViewController {


let webView: WKWebView = {
 let prefs = WKWebpagePreferences()
 prefs.allowsContentJavaScript = true
 let configuration = WKWebViewConfiguration()
 configuration.defaultWebpagePreferences = prefs
 let webView = WKWebView(frame: .zero, configuration: configuration)
 
 return webView
 }()

override func viewDidLoad() {
 super.viewDidLoad()
 view.addSubview(webView)
 // Do any additional setup after loading the view.
 
 guard let url = URL(string: "https://example-root.com/") else {
   return
 }
 webView.load(URLRequest(url: url))
 
 
 
 DispatchQueue.main.asyncAfter(deadline: .now()+5) {
   self.webView.evaluateJavaScript("document.body.innerHTML") { result, error in guard lethtml = result as? String, error == nil else {
       return
     }
   }
   
  }
  }
  override func viewDidLayoutSubviews() {
 super.viewDidLayoutSubviews()
 webView.frame = view.bounds
  }

}

标签: ioswkwebviewwkwebviewconfiguration

解决方案


没错,您需要使用 NavigationDelegate 来拦截导航操作。使您的 ViewController 符合WKNavigationDelegate并实现该webView(_:decidePolicyFor:decisionHandler:)方法:

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

        if let url = navigationAction.request.url, !url.host.contains("example-root.com") {
            UIApplication.shared.open(url)
            decisionHandler(.cancel)
            return
        }
        decisionHandler(.allow)
    }
}

不要忘记设置navigationDelegate您的 WKWebView 的属性,您可以viewDidLoad使用以下方法执行此操作:

webView.navigationDelegate = self

推荐阅读