アプリケーションにWebViewがあり、(WebView自体ではなく)WebView内でクリックしたリンクをSafariで開きたい。
私はSwiftでアプリケーションを開発しています。
これを行うための最良の方法は何ですか?
これは、本質的に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
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
}
WebビューのデリゲートにメソッドwebViewShouldStartLoadingWithRequest:navigationType
を実装し、Safariで開くリンクを探す必要があります。これらを[[UIApplication sharedApplication]openURL:]
でOSに送信すると、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
}