[英]Making certain links in WKWebView open in Safari, not the Webview
我有一個 WebView 應用程序,其中包含我希望用戶在 Safari 中打開的外部鏈接,而不是 webview 本身,點擊。 我相信它與導航委托有關,但我是 iOS 開發新手,不知道從哪里開始! 下面是我今天的代碼。 如果您能具體告訴我要進行哪些更改以及在何處放置任何代碼,那將使我的生活變得更加輕松。 提前感謝大家的幫助! 我認為有一種方法可以設置導航委托,以便所有以https://example-root.com/開頭的 URL 在 webview 中正常打開,因為它們是本機導航按鈕,但我想打開所有其他 URL在 safari 中。
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
}
}
您是對的,您需要使用 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)
}
}
不要忘記設置 WKWebView 的navigationDelegate
屬性,您可以在viewDidLoad
使用以下內容執行此操作:
webView.navigationDelegate = self
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.