web-dev-qa-db-ja.com

WebView内でクリックされたリンクをSafariで強制的に開くにはどうすればよいですか?

アプリケーションにWebViewがあり、(WebView自体ではなく)WebView内でクリックしたリンクをSafariで開きたい。

私はSwiftでアプリケーションを開発しています。

これを行うための最良の方法は何ですか?

15
Kian Cross

これは、本質的にSwiftでObj-Cと同じように行われます。

まず、ビューコントローラがUIWebViewDelegateに準拠していることを宣言します

class MyViewController: UIWebViewDelegate

次に実装 webViewShouldStartLoadingWithRequest:navigationType: View Controllerで:

// 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
44
Ronald Martin

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
}
7
Femi Loki

WebビューのデリゲートにメソッドwebViewShouldStartLoadingWithRequest:navigationTypeを実装し、Safariで開くリンクを探す必要があります。これらを[[UIApplication sharedApplication]openURL:]でOSに送信すると、Safariで開きます。

3
jefflovejapan

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
}
0
Cesar Bielich