在 Safari 中打开 UIWebView 链接

Open UIWebView Links In Safari

我有一个 iOS 应用程序使用 Swift 3. 我在这个应用程序中有一个 uiwebview。每当用户在 webview 中单击 link 时,它就会在 webview 中打开。我需要它到 link 在 iPhone 上的 Safari 应用程序中打开的位置。这是代码:

class VideosViewController: UIViewController {

    @IBOutlet var webView: UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        var URL = NSURL(string: "http://example.com")

        webView.loadRequest(NSURLRequest(url: URL! as URL) as URLRequest)


    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

你能给我一些我可以输入的代码吗?我是编码新手,非常感谢。

更新: 多亏了一个答案,我得到了一些代码,但是 links 仍然没有在 Safari 中打开。这是到目前为止的代码...

class VideosViewController : UIViewController, UIWebViewDelegate {

@IBOutlet weak var webView : UIWebView!

override func viewDidLoad() {
    super.viewDidLoad()

    guard let url = URL(string: "http://example.com") else { return }

    let request = URLRequest(url: url)
    webView.loadRequest(request)

}

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {

    if navigationType == .linkClicked {

        guard let url = request.url else { return true }
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
        return false
    }
    return true
}

}

使用 UIWebView:

确保您的视图控制器符合UIWebViewDelegate,然后在控制器中实现此方法:

class VideosViewController : UIViewController, UIWebViewDelegate {

    @IBOutlet weak var webView : UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let url = URL(string: "http://example.com") else { return }
        
        webView.delegate = self

        let request = URLRequest(url: url)
        webView.loadRequest(request)

    }

    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    
        if navigationType == .linkClicked {
        
            guard let url = request.url else { return true }
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
            return false
        }
        return true
    }
}

使用 WKWebView:

使用 WKWebView 而不是 UIWebView 并确保您的控制器符合 WKNavigationDelegate 协议。所以你的实现看起来像下面这样:

class VideosViewController : UIViewController, WKNavigationDelegate {

    var webView : WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
    
        guard let url = URL(string: "http://example.com") else { return }
    
        webView = WKWebView(frame: self.view.frame)
        webView.translatesAutoresizingMaskIntoConstraints = false
        webView.isUserInteractionEnabled = true
        webView.navigationDelegate = self
    
        self.view.addSubview(self.webView)
    
        let request = URLRequest(url: url)
        webView.load(request)
    
    }


    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    
        // Check if a link was clicked
        if navigationAction.navigationType == .linkActivated {
        
            // Verify the url
            guard let url = navigationAction.request.url else { return }
            let shared = UIApplication.shared
        
            // Check if opening in Safari is allowd
            if shared.canOpenURL(url) {
            
                // Ask the user if they would like to open link in Safari
                let alert = UIAlertController(title: "Open link in Safari?", message: nil, preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "Yes", style: .default, handler: { (alert: UIAlertAction) -> Void in
                    // User wants to open in Safari
                    shared.open(url, options: [:], completionHandler: nil)
                }))
                alert.addAction(UIAlertAction(title: "No", style: .cancel, handler: nil))
            
                present(alert, animated: true, completion: nil)
            
            }
            decisionHandler(.cancel)
        }
        decisionHandler(.allow)
    }
}

这样,当用户在网络视图中单击 link 时,系统会提示他们是否要在 Safari 中打开它,以及是否愿意允许,Safari 将启动并打开 link。