[英]How can I force any links clicked within a WebView to open in Safari?
我的應用程序中有一個 WebView,我希望在 WebView 中單擊的任何鏈接在 Safari 中打開(而不是 WebView 本身)。
我正在 Swift 中開發應用程序。
執行此操作的最佳方法是什么?
這在 Swift 中的完成方式與 Obj-C 中的基本相同:
首先,聲明你的視圖控制器符合UIWebViewDelegate
class MyViewController: UIWebViewDelegate
然后在你的視圖控制器中實現webViewShouldStartLoadingWithRequest:navigationType:
:
// Swift 1 & 2
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
switch navigationType {
case .LinkClicked:
// Open links in Safari
UIApplication.sharedApplication().openURL(request.URL)
return false
default:
// Handle other navigation types...
return true
}
}
// Swift 3
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
switch navigationType {
case .linkClicked:
// Open links in Safari
guard let url = request.url else { return true }
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
// openURL(_:) is deprecated in iOS 10+.
UIApplication.shared.openURL(url)
}
return false
default:
// Handle other navigation types...
return true
}
}
最后,設置您的UIWebView
的委托,例如,在viewDidLoad
或您的 Storyboard 中:
webView.delegate = self
為 swift 3 更新
func webView(_: UIWebView, shouldStartLoadWith: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if navigationType == UIWebViewNavigationType.linkClicked {
UIApplication.shared.open(shouldStartLoadWith.url!, options: [:], completionHandler: nil)
return false
}
return true
}
根據蘋果文檔中的建議
UIWebView 在 iOS 12 之后也被棄用
這是使用 Swift 5.3 和 WKWebiew 的解決方案
首先用 WKWebview 替換你的 UIWebview
然后符合WKNavigationDelegate並實現方法
這是代碼
extension WebViewControllerImpl: WKNavigationDelegate {
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
guard case .linkActivated = navigationAction.navigationType,
let url = navigationAction.request.url
else {
decisionHandler(.allow)
return
}
decisionHandler(.cancel)
UIApplication.shared.openURL(url)
}
}
然后為您的 wkWebView 設置“navigationDelegate”
wkWebView.navigationDelegate = self
您需要在 Web 視圖的委托上實現方法webViewShouldStartLoadingWithRequest:navigationType
並查找要在 Safari 中打開的鏈接。 如果您使用[[UIApplication sharedApplication]openURL:]
將它們發送到操作系統,它們將在 Safari 中打開。
為 swift 4.2 更新
func webView(_: UIWebView, shouldStartLoadWith: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
if navigationType == UIWebView.NavigationType.linkClicked {
UIApplication.shared.open(shouldStartLoadWith.url!, options: [:], completionHandler: nil)
return false
}
return true
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.