comment ouvrir une URL dans Swift3

149

openURLest obsolète dans Swift3. Quelqu'un peut-il donner des exemples du fonctionnement du remplacement openURL:options:completionHandler:lors de la tentative d'ouverture d'une URL?

Shane O'Seasnain
la source

Réponses:

385

Tout ce dont tu as besoin c'est:

guard let url = URL(string: "http://www.google.com") else {
  return //be safe
}

if #available(iOS 10.0, *) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
    UIApplication.shared.openURL(url)
}
Devran Cosmo Uenal
la source
et si j'utilise l'opérateur «+» dans mon URL? Par exemple: " xxxxx.com./... " comme ceci. Cette chaîne m'a donné une erreur "Aucun candidat '+' ne produit le type de résultat contextuel attendu 'URL"
Ibrahim BOLAT
vous devez utiliser l'opérateur + sur votre à la Stringplace sur leURL
Devran Cosmo Uenal
Note latérale: n'essayez pas de faire ceci: UIApplication.shared.openURL (URL (string: "insert url here")!). Le compilateur sur XCode 8 sera confus et ne pourra pas construire correctement. Alors utilisez simplement cette solution telle quelle. Fonctionne très bien! Merci.
Joel
Comment ouvrir l'URL sans ouvrir Safari? Comment faire "ouvrir" l'URL en arrière-plan? Veuillez répondre à ma question sur: stackoverflow.com/questions/43686252/… .
Christian Kreiter
1
Vous voulez dire que Swift ne vous oblige pas à escalader les murs pour faire quelque chose d'aussi complexe que d'ouvrir une URL? [mâchoire tombée]
Daniel Springer
36

La réponse ci-dessus est correcte, mais si vous voulez vous vérifier canOpenUrlou non, essayez comme ça.

let url = URL(string: "http://www.facebook.com")!
if UIApplication.shared.canOpenURL(url) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
    //If you want handle the completion block than 
    UIApplication.shared.open(url, options: [:], completionHandler: { (success) in
         print("Open url : \(success)")
    })
}

Remarque: si vous ne souhaitez pas gérer la complétion, vous pouvez également écrire comme ceci.

UIApplication.shared.open(url, options: [:])

Pas besoin d'écrire completionHandlercar il contient la valeur par défaut nil, consultez la documentation Apple pour plus de détails.

Nirav D
la source
28

Si vous souhaitez ouvrir à l'intérieur de l'application elle-même au lieu de quitter l'application, vous pouvez importer SafariServices et le résoudre .

import UIKit
import SafariServices

let url = URL(string: "https://www.google.com")
let vc = SFSafariViewController(url: url!)
present(vc, animated: true, completion: nil)
Chetan Rajagiri
la source
1
Cette méthode est la meilleure pratique selon les directives iOS
gtrujillos
8

Version Swift 3

import UIKit

protocol PhoneCalling {
    func call(phoneNumber: String)
}

extension PhoneCalling {
    func call(phoneNumber: String) {
        let cleanNumber = phoneNumber.replacingOccurrences(of: " ", with: "").replacingOccurrences(of: "-", with: "")
        guard let number = URL(string: "telprompt://" + cleanNumber) else { return }

        UIApplication.shared.open(number, options: [:], completionHandler: nil)
    }
}
Démosthese
la source
vous pouvez utiliser une expression régulière avec replacingOccurrences.
Sulthan
2

J'utilise macOS Sierra (v10.12.1) Xcode v8.1 Swift 3.0.1 et voici ce qui a fonctionné pour moi dans ViewController.swift:

//
//  ViewController.swift
//  UIWebViewExample
//
//  Created by Scott Maretick on 1/2/17.
//  Copyright © 2017 Scott Maretick. All rights reserved.
//

import UIKit
import WebKit

class ViewController: UIViewController {

    //added this code
    @IBOutlet weak var webView: UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Your webView code goes here
        let url = URL(string: "https://www.google.com")
        if UIApplication.shared.canOpenURL(url!) {
            UIApplication.shared.open(url!, options: [:], completionHandler: nil)
            //If you want handle the completion block than
            UIApplication.shared.open(url!, options: [:], completionHandler: { (success) in
                print("Open url : \(success)")
            })
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


};
Scott Maretick
la source
2
import UIKit 
import SafariServices 

let url = URL(string: "https://sprotechs.com")
let vc = SFSafariViewController(url: url!) 
present(vc, animated: true, completion: nil)
Salman Khan
la source