J'ai une vue Web dans mon application et j'aimerais que tous les liens de la vue Web s'ouvrent dans safari au lieu de la vue Web elle-même.
Je suis en train de coder l'application dans Swift et j'ai déjà eu quelques réponses pour objective-c mais aucune pour Swift.
Est-ce que quelqu'un sait comment je peux m'y prendre?
Cela se fait essentiellement de la même manière dans Swift et dans Obj-C:
Tout d’abord, déclarez que votre contrôleur de vue est conforme à UIWebViewDelegate
class MyViewController: UIWebViewDelegate
Puis implémentez webViewShouldStartLoadingWithRequest:navigationType:
dans votre 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
}
}
Enfin, définissez votre délégué UIWebView
, par exemple, dans viewDidLoad
ou dans votre story-board:
webView.delegate = self
Mis à jour pour 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
}
Vous devez implémenter la méthode webViewShouldStartLoadingWithRequest:navigationType
sur le délégué de votre vue Web et rechercher les liens que vous souhaitez ouvrir dans Safari. Si vous les envoyez au système d'exploitation avec [[UIApplication sharedApplication]openURL:]
, ils s'ouvriront dans Safari.
Mis à jour pour 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
}