ios - 使 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
}
}
解决方案
没错,您需要使用 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
推荐阅读
- authentication - 企业代理背后的 asp.net core 3.1 azure ad SSO 身份验证
- aws-api-gateway - 如何通过 API Gateway HTTP 代理集成访问 Cognito 授权身份?
- c# - Handling submit action from Adaptive Card in Waterflow dialog in WebEx
- r - Cross Validation K-fold Extreme error rate
- circleci - Chrome fails to install Circle Ci
- c# - 如何拆分它们是冒号的csv列
- listview - Remove button to remove selected row from listview JavaFX
- python-3.x - i am a beginner an wanted to make an app to know the kind of the triangle according to its sides
- swift - Passing header data with a URLSession in a MacOS app, getting nil response
- node.js - MongoDB:如何通过舍入特定字段来查询文档