如何强制在WebView中单击的任何链接在Safari中打开?

时间:2015-02-18 01:15:34

标签: ios xcode swift hyperlink webview

我的应用程序中有一个WebView,我希望在WebView中点击任何链接在Safari中打开(而不是WebView本身)。

我正在使用Swift开发应用程序。

这样做的最佳方法是什么?

5 个答案:

答案 0 :(得分:43)

这在Swift和Obj-C中完全相同:

首先,声明您的视图控制器符合UIWebViewDelegate

class MyViewController: UIWebViewDelegate

然后在View Controller中实现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或故事板中的代理人:

webView.delegate = self

答案 1 :(得分:7)

更新了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
}

答案 2 :(得分:3)

您需要在网络视图的委托上实施方法webViewShouldStartLoadingWithRequest:navigationType,并查找要在Safari中打开的链接。如果您使用[[UIApplication sharedApplication]openURL:]将其发送到操作系统,则会在Safari中打开。

答案 3 :(得分:1)

根据Apple文档中的建议

enter image description here

在12个iOS之后也不推荐使用UIWebView

这是使用Swift 5.3和WKWebiew的解决方案

首先用WKWebview替换UIWebview

然后遵守WKNavigationDelegate并实现方法

enter image description here

这是代码

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

答案 4 :(得分:0)

已针对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
}
相关问题