簡體   English   中英

如何強制在 WebView 中單擊的任何鏈接在 Safari 中打開?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM