100 votes

Comment passer un appel sous iOS 10 avec Swift?

Je souhaite que mon application puisse appeler un certain numéro lorsqu'un clic est effectué sur un bouton. J'ai essayé de le rechercher sur Google mais il ne semble pas en avoir un pour iOS 10 à ce jour (où openURL a disparu). Quelqu'un peut-il me donner un exemple sur la façon de le faire? Par exemple, comme:

 @IBAction func callPoliceButton(_ sender: UIButton) {
    // Call the local Police department
}
 

184voto

Parth Adroja Points 6726

Vous pouvez appeler comme ça:

  if let url = URL(string: "tel://\(number)") {
                UIApplication.shared.openURL(url)
            }
 

Pour Swift 3+ , vous pouvez utiliser comme

 guard let number = URL(string: "tel://" + number) else { return }
UIApplication.shared.open(number)

OR

UIApplication.shared.open(number, options: [:], completionHandler: nil)
 

Assurez-vous que vous avez nettoyé la chaîne de votre numéro de téléphone pour supprimer toutes les instances de ( , ) , - ou space .

89voto

Vasily Bodnarchuk Points 8047

Tâche

Passer un appel avec validation du numéro de téléphone

Détails

Xcode 9.2, Swift 4

Solution

 extension String {

    enum RegularExpressions: String {
        case phone = "^\\s*(?:\\+?(\\d{1,3}))?([-. (]*(\\d{3})[-. )]*)?((\\d{3})[-. ]*(\\d{2,4})(?:[-.x ]*(\\d+))?)\\s*$"
    }

    func isValid(regex: RegularExpressions) -> Bool {
        return isValid(regex: regex.rawValue)
    }

    func isValid(regex: String) -> Bool {
        let matches = range(of: regex, options: .regularExpression)
        return matches != nil
    }

    func onlyDigits() -> String {
        let filtredUnicodeScalars = unicodeScalars.filter{CharacterSet.decimalDigits.contains($0)}
        return String(String.UnicodeScalarView(filtredUnicodeScalars))
    }

    func makeAColl() {
        if isValid(regex: .phone) {
            if let url = URL(string: "tel://\(self.onlyDigits())"), UIApplication.shared.canOpenURL(url) {
                if #available(iOS 10, *) {
                    UIApplication.shared.open(url)
                } else {
                    UIApplication.shared.openURL(url)
                }
            }
        }
    }
}
 

Usage

 "+1-(800)-123-4567".makeAColl()
 

Échantillon pour test

 func test() {
    isPhone("blabla")
    isPhone("+1(222)333-44-55")
    isPhone("+42 555.123.4567")
    isPhone("+1-(800)-123-4567")
    isPhone("+7 555 1234567")
    isPhone("+7(926)1234567")
    isPhone("(926) 1234567")
    isPhone("+79261234567")
    isPhone("926 1234567")
    isPhone("9261234567")
    isPhone("1234567")
    isPhone("123-4567")
    isPhone("123-89-01")
    isPhone("495 1234567")
    isPhone("469 123 45 67")
    isPhone("8 (926) 1234567")
    isPhone("89261234567")
    isPhone("926.123.4567")
    isPhone("415-555-1234")
    isPhone("650-555-2345")
    isPhone("(416)555-3456")
    isPhone("202 555 4567")
    isPhone("4035555678")
    isPhone(" 1 416 555 9292")
}

private func isPhone(_ string: String) {
    let result = string.isValid(regex: .phone)
    print("\(result ? "✅" : "❌") \(string) | \(string.onlyDigits()) | \(result ? "[a phone number]" : "[not a phone number]")")
}
 

Résultat

entrez la description de l'image ici

23voto

Dans Swift 4.2

 func dialNumber(number : String) {

 if let url = URL(string: "tel://\(number)"),
   UIApplication.shared.canOpenURL(url) {
      if #available(iOS 10, *) {
        UIApplication.shared.open(url, options: [:], completionHandler:nil)
       } else {
           UIApplication.shared.openURL(url)
       }
   } else {
            // add error message here 
   }
}
 

Appelez ceci comme ci-dessous

 dialNumber(number: "+921111111222")
 

J'espère que cette aide.

18voto

Kiran jadhav Points 1525

Mise à jour pour Swift 3:

utilisé sous de simples lignes de code, si vous souhaitez effectuer un appel téléphonique:

// définition de la fonction:

 func makeAPhoneCall()  {
    let url: NSURL = URL(string: "TEL://1234567890")! as NSURL
    UIApplication.shared.open(url as URL, options: [:], completionHandler: nil)
}
 

// appel de fonction: [Utilisé n'importe où dans votre code]

 self.makeAPhoneCall()
 

Remarque: Veuillez exécuter l'application sur un appareil réel, car cela ne fonctionnera pas sur le simulateur.

7voto

Anjali jariwala Points 154

Par erreur, ma réponse a été mal placée, veuillez vérifier celui-ci: Vous pouvez utiliser ceci:

 guard let url = URL(string: "tel://\(yourNumber)") else {
return //be safe
}

if #available(iOS 10.0, *) {
UIApplication.shared.open(url)
} else {
UIApplication.shared.openURL(url)
}
 

Nous devons vérifier si nous sommes sur iOS 10 ou une version ultérieure car 'openURL' était obsolète dans iOS 10.0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X