Swift Open Link dans Safari

150

J'ouvre actuellement le lien dans mon application dans un WebView, mais je recherche une option pour ouvrir le lien dans Safari à la place.

Fabian Boulegue
la source

Réponses:

348

Ce n'est pas "intégré à Swift", mais vous pouvez utiliser des UIKitméthodes standard pour le faire. Jetez un œil à UIApplication (obsolète) et .openUrl(_:) open(_:options:completionHandler:)

Swift 4 + Swift 5 (iOS 10 et supérieur)

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.shared.open(url)

Swift 3 (iOS 9 et inférieur)

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.shared.openURL(url)

Swift 2.2

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.sharedApplication().openURL(url)    
Mike S
la source
Y a-t-il une chance dans l'App Store si nous ajoutons une URL d'achat comme celle-ci?
Jan
8
Dans iOS 10.0, vous devez maintenant ajouter des options et un gestionnaire: UIApplication.shared.open (URL (string: " google.com" ) !, options: [:], completionHandler: nil)
gabicuesta
1
@gabicuesta En fait, vous n'avez pas à fournir d'options et de completionHandler, ils sont respectivement [:] et nil par défaut
Jeremy
79

Nouveau avec iOS 9 et supérieur, vous pouvez présenter à l'utilisateur un SFSafariViewController(voir la documentation ici ). Fondamentalement, vous bénéficiez de tous les avantages d'envoyer l'utilisateur vers Safari sans le faire quitter votre application. Pour utiliser simplement le nouveau SFSafariViewController:

import SafariServices

et quelque part dans un gestionnaire d'événements, présentez à l'utilisateur le contrôleur de vue safari comme ceci:

let svc = SFSafariViewController(url: url)
present(svc, animated: true, completion: nil)

La vue safari ressemblera à ceci:

entrez la description de l'image ici

manncito
la source
3
C'est génial. Merci! Tous ceux qui souhaitent afficher le navigateur Safari dans une extension d'application doivent utiliser ce code. L'accès à la sharedApplicationpropriété dans l'extension d'application est interdit. Pour en savoir plus: developer.apple.com/library/archive/documentation/General/…
Baran Emre
1
solution exceptionnelle
Mutawe
1
Apple rejette parfois les applications du magasin pour avoir utilisé l'ancienne méthode openURL. Cela devrait maintenant être la solution préférée.
disconnectionist
19

MISE À JOUR pour Swift 4: (crédit à Marco Weber)

if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") {
     UIApplication.shared.openURL(requestUrl as URL) 
}

OU optez pour un style plus rapide en utilisant guard:

guard let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") else {
    return
}

UIApplication.shared.openURL(requestUrl as URL) 

Swift 3:

Vous pouvez vérifier NSURL comme facultatif implicitement en:

if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") {
     UIApplication.sharedApplication().openURL(requestUrl)
}
CodeOverRide
la source
4
Amit, Non, parce que c'est fait explicitement comme je l'ai expliqué, c'est la garantie que requestUrl existe si let requestUrl = ...
CodeOverRide
2
oui, il existe de nombreuses façons de faire les choses. Apprenez la raison pour laquelle vous devriez utiliser un certain code dans une situation au lieu d'être un gamin têtu en disant: "J'ai raison, donc votre mauvaise" mentalité. On dirait que vous êtes nouveau dans la programmation, c'est mon conseil à votre enfant.
CodeOverRide
3
Amit: Non, ça ne marche pas, tu as tout simplement tort. Dans Swift 2 ou 1.2. Et pas étonnant, requestUrl n'est pas une option, vous ne pouvez donc pas le déballer avec!.
Gusutafu
2
J'aime mieux cette méthode que celle de Mike S, car vous faites la vérification de zéro avant d'envoyer la demande.
Nikolaj Nielsen du
1
mis à jour pour Swift4:if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") { UIApplication.shared.openURL(requestUrl as URL) }
Marco Weber
12

Swift 3 et IOS 10.2

UIApplication.shared.open(URL(string: "http://www.stackoverflow.com")!, options: [:], completionHandler: nil)

Swift 3 et IOS 10.2

ramchandra n
la source
Mais notez que l'utilisation de cette version arrêtera l'exécution de votre application sur iOS 9 et les versions antérieures à moins que vous ne la
vérifiiez
11

depuis iOS 10, vous devez utiliser:

guard let url = URL(string: linkUrlString) else {
    return
}
    
if #available(iOS 10.0, *) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
    UIApplication.shared.openURL(url)
}
Samira Ekrami
la source
2

Dans Swift 1.2:

@IBAction func openLink {    
    let pth = "http://www.google.com"
    if let url = NSURL(string: pth){
        UIApplication.sharedApplication().openURL(url)
}
Amit Kalra
la source
1

Dans Swift 2.0:

UIApplication.sharedApplication().openURL(NSURL(string: "http://stackoverflow.com")!)
Kaptain
la source
-1

IOS 11.2 Swift 3.1 à 4

let webView = WKWebView()

override func viewDidLoad() {
    super.viewDidLoad()
    guard let url = URL(string: "https://www.google.com") else { return }
    webView.frame = view.bounds
    webView.navigationDelegate = self
    webView.load(URLRequest(url: url))
    webView.autoresizingMask = [.flexibleWidth,.flexibleHeight]
    view.addSubview(webView)
}

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if navigationAction.navigationType == .linkActivated  {
        if let url = navigationAction.request.url,
            let host = url.host, !host.hasPrefix("www.google.com"),
            UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url)
            print(url)
            print("Redirected to browser. No need to open it locally")
            decisionHandler(.cancel)
        } else {
            print("Open it locally")
            decisionHandler(.allow)
        }
    } else {
        print("not a user click")
        decisionHandler(.allow)
    }
}
guevara lopez
la source