web-dev-qa-db-fra.com

Comment utiliser openURL pour passer un appel téléphonique dans Swift?

J'ai converti le code pour passer un appel téléphonique d'Objective-C à Swift, mais dans Objective-C, nous pouvons définir le type de l'URL que nous aimons ouvrir (par exemple, téléphone, SMS, Web) de la manière suivante:

@"tel:xx"
@"mailto:[email protected]"
@"http://stackoverflow.com"
@"sms:768number"

Le code dans Swift est:

UIApplication.sharedApplication().openURL(NSURL(string : "9809088798")

J'ai lu que je n'ai publié aucun paramètre de schéma pour tel:, mais je ne sais pas si Swift peut détecter si la chaîne sert à passer un appel téléphonique, à envoyer un courrier électronique ou à ouvrir un site Web. Ou puis-je écrire:

(string : "tel//:9809088798")

?

39
user3739367

Je suis sûr que tu veux:

UIApplication.sharedApplication().openURL(NSURL(string: "tel://9809088798")!)

(notez que dans le texte de votre question, vous avez mis tel//:, ne pas tel://).

La chaîne init de NSURL attend une URL bien formée. Cela ne transformera pas un tas de numéros en un numéro de téléphone. Vous voyez parfois la détection de numéro de téléphone dans UIWebView, mais cela se fait à un niveau supérieur à celui de NSURL.

EDIT: ajouté! par commentaire ci-dessous

76
Lou Franco

Une solution autonome en Swift:

private func callNumber(phoneNumber:String) {
  if let phoneCallURL:NSURL = NSURL(string:"tel://\(phoneNumber)") {
    let application:UIApplication = UIApplication.sharedApplication()
    if (application.canOpenURL(phoneCallURL)) {
      application.openURL(phoneCallURL);
    }
  }
}

Vous devriez maintenant pouvoir utiliser callNumber("7178881234") pour passer un appel.

16
Zorayr

Pour Swift sous iOS:

var url:NSURL? = NSURL(string: "tel://9809088798")
UIApplication.sharedApplication().openURL(url!)
6
Vinod Joshi

N'oubliez pas de supprimer les espaces, sinon cela ne fonctionnera pas:

if let telephoneURL = NSURL(string: "telprompt://\(phoneNumber.stringByReplacingOccurrencesOfString(" ", withString: ""))") {
        UIApplication.sharedApplication().openURL(telelphoneURL)
    }

"telprompt: //" invitera l'utilisateur à appeler ou à annuler tandis que "tel: //" appellera directement.

6
Robert Wagstaff

@ confile:

Le problème est que votre solution ne revient pas à l'application une fois l'appel téléphonique terminé sur iOS7. - 19 juin à 13h50

& @ Zorayr

Hm, curieux de savoir s'il existe une solution qui le fasse .. pourrait être une restriction sur iOS.

utilisation

UIApplication.sharedApplication().openURL(NSURL(string: "telprompt://9809088798")!)

Vous obtiendrez une invite à appeler/annuler, mais celle-ci reviendra à votre application. Autant que je sache, il n'y a aucun moyen de revenir (sans demander)

5
Glenn

Petite mise à jour à Swift 3

UIApplication.shared.openURL(NSURL(string: "telprompt://9809088798")! as URL)
4
Paula Hasstenteufel

Vous devez insérer "+"\est une autre façon

private func callNumber(phoneNumber:String) {
  if let phoneCallURL:NSURL = NSURL(string:"tel://"+"\(phoneNumber)") {
    let application:UIApplication = UIApplication.sharedApplication()
    if (application.canOpenURL(phoneCallURL)) {
      application.openURL(phoneCallURL);
    }
  }
}
4
Mauricio Lucon

L'extrait de code suivant peut indiquer si la carte SIM est présente ou non, et si le périphérique est capable de passer l'appel et s'il est d'accord, l'appel sera passé.

  var info = CTTelephonyNetworkInfo()
    var carrier = info.subscriberCellularProvider
    if carrier != nil && carrier.mobileNetworkCode == nil || carrier.mobileNetworkCode.isEqual("") {
       //SIM is not there in the phone
    }
    else if UIApplication.sharedApplication().canopenURL(NSURL(string: "tel://9809088798")!)
    {
    UIApplication.sharedApplication().openURL(NSURL(string: "tel://9809088798")!)
    }
    else    
    {
      //Device does not have call making capability  
    }
2
Durai Amuthan.H

Pour Swift 4:

func call(phoneNumber: String) {
    if let url = URL(string: phoneNumber) {
        if #available(iOS 10, *) {
            UIApplication.shared.open(url, options: [:],
                                      completionHandler: {
                                        (success) in
                                        print("Open \(phoneNumber): \(success)")
            })
        } else {
            let success = UIApplication.shared.openURL(url)
            print("Open \(phoneNumber): \(success)")
        }
    }
} 

Ensuite, utilisez la fonction:

let phoneNumber = "tel://+132342424"
call(phoneNumber: phoneNumber)
0
wieblinger

Pour Swift 3

if let phoneCallURL:URL = URL(string:"tel://\(phoneNumber ?? "")") {
            let application:UIApplication = UIApplication.shared
            if (application.canOpenURL(phoneCallURL)) {
                application.open(phoneCallURL, options: [:], completionHandler: nil);
            }
        }
0
Arshad