Appeler un numéro de téléphone à swift

j'essaye d'appeler un numéro qui n'utilise pas de numéros spécifiques mais un numéro qui est appelé dans une variable ou au moins lui dire de remonter le numéro dans votre téléphone. Ce nombre qui est appelé dans une variable est un nombre que j'ai récupéré en utilisant un analyseur ou en saisissant à partir d'un site sql. J'ai fait un bouton d'essayer d'appeler le numéro de téléphone stocké dans la variable avec une fonction, mais en vain. Tout va aider merci!

    func callSellerPressed (sender: UIButton!){
 //(This is calls a specific number)UIApplication.sharedApplication().openURL(NSURL(string: "tel://######")!)

 // This is the code I'm using but its not working      
 UIApplication.sharedApplication().openURL(NSURL(scheme: NSString(), host: "tel://", path: busPhone)!)

        }
50
demandé sur Vadim Kotov 2014-12-03 00:59:11

17 réponses

Juste essayer:

if let url = NSURL(string: "tel://\(busPhone)") where UIApplication.sharedApplication().canOpenURL(url) {
  UIApplication.sharedApplication().openURL(url)
}

en supposant que le numéro de téléphone est dans busPhone .

NSURL 's init(string:) retourne une option, donc en utilisant if let nous nous assurons que url est un NSURL (et non un NSURL? comme retourné par le init ).


Pour Swift 3:

if let url = URL(string: "tel://\(busPhone)"), UIApplication.shared.canOpenURL(url) {
    if #available(iOS 10, *) {
        UIApplication.shared.open(url)
    } else {
        UIApplication.shared.openURL(url)
    }
}

nous devons vérifier si nous sommes sur iOS 10 ou plus tard parce que:

'openURL" a été déprécié dans iOS 10.0

139
répondu Thomas Müller 2017-06-08 23:53:31

d'Une solution d'iOS 10, "151930920 Swift" 3 :

private func callNumber(phoneNumber:String) {

  if let phoneCallURL = URL(string: "tel://\(phoneNumber)") {

    let application:UIApplication = UIApplication.shared
    if (application.canOpenURL(phoneCallURL)) {
        application.open(phoneCallURL, options: [:], completionHandler: nil)
    }
  }
}

vous devriez pouvoir utiliser callNumber("7178881234") pour faire un appel.

55
répondu Zorayr 2017-03-17 20:10:06

OK j'ai eu de l'AIDE et j'ai compris. J'ai aussi mis un petit système d'alerte au cas où le numéro de téléphone ne serait pas valide. Mon problème était que je l'appelais bien mais le nombre avait des espaces et des caractères indésirables tels que ("123 456-7890"). UIApplication ne fonctionne ou n'accepte que si votre numéro est ("1234567890"). Donc vous supprimez essentiellement l'espace et les caractères invalides en faisant une nouvelle variable pour tirer seulement les nombres. Puis appelle ces numéros avec L'UIApplication.

func callSellerPressed (sender: UIButton!){
        var newPhone = ""

        for (var i = 0; i < countElements(busPhone); i++){

            var current:Int = i
            switch (busPhone[i]){
                case "0","1","2","3","4","5","6","7","8","9" : newPhone = newPhone + String(busPhone[i])
                default : println("Removed invalid character.")
            }
        }

        if  (busPhone.utf16Count > 1){

        UIApplication.sharedApplication().openURL(NSURL(string: "tel://" + newPhone)!)
        }
        else{
            let alert = UIAlertView()
            alert.title = "Sorry!"
            alert.message = "Phone number is not available for this business"
            alert.addButtonWithTitle("Ok")
                alert.show()
        }
        }
8
répondu Tom 2014-12-17 21:03:58

Swift 3.0 et ios 10 ou plus

func phone(phoneNum: String) {
    if let url = URL(string: "tel://\(phoneNum)") {
        if #available(iOS 10, *) {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        } else {
            UIApplication.shared.openURL(url as URL)
        }
    }
}
8
répondu Gandom 2016-12-23 09:28:43

Les réponses ci-dessus sont en partie exact, mais avec "tél://" il y a un seul problème. Lorsque l'appel est terminé, vous revenez à l'écran d'accueil, pas à notre application. Donc mieux utiliser " telprompt://", il retournera à l'application.

var url:NSURL = NSURL(string: "telprompt://1234567891")!
UIApplication.sharedApplication().openURL(url)
7
répondu dipen baks 2016-10-24 10:22:10

j'utilise cette méthode dans mon application et ça marche très bien. J'espère que cela peut vous aider aussi.

func makeCall(phone: String) {
    let formatedNumber = phone.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).joinWithSeparator("")
    let phoneUrl = "tel://\(formatedNumber)"
    let url:NSURL = NSURL(string: phoneUrl)!
    UIApplication.sharedApplication().openURL(url)
}
6
répondu Ayath Khan 2016-04-27 05:07:19

Swift 3, iOS 10

func call(phoneNumber:String) {
        let cleanPhoneNumber = phoneNumber.components(separatedBy: CharacterSet.decimalDigits.inverted).joined(separator: "")
        let urlString:String = "tel://\(cleanPhoneNumber)"
        if let phoneCallURL = URL(string: urlString) {
            if (UIApplication.shared.canOpenURL(phoneCallURL)) {
                UIApplication.shared.open(phoneCallURL, options: [:], completionHandler: nil)
            }
        }
  }
5
répondu LuAndre 2017-09-08 23:23:17

Dans Swift 3,

if let url = URL(string:"tel://\(phoneNumber)"), UIApplication.shared.canOpenURL(url) {
     UIApplication.shared.openURL(url)
}
4
répondu Venkadesh 2016-12-07 04:52:47

ceci est une mise à jour de la réponse de @Tom en utilisant Swift 2.0 Note - c'est toute la classe CallComposer que j'utilise.

class CallComposer: NSObject {

var editedPhoneNumber = ""

func call(phoneNumber: String) -> Bool {

    if phoneNumber != "" {

        for i in number.characters {

            switch (i){
                case "0","1","2","3","4","5","6","7","8","9" : editedPhoneNumber = editedPhoneNumber + String(i)
                default : print("Removed invalid character.")
            }
        }

    let phone = "tel://" + editedPhoneNumber
        let url = NSURL(string: phone)
        if let url = url {
            UIApplication.sharedApplication().openURL(url)
        } else {
            print("There was an error")
        }
    } else {
        return false
    }

    return true
 }
}
3
répondu Michael McKenna 2016-08-01 02:54:15

j'utilise la solution swift 3 avec validation du numéro

var validPhoneNumber = ""
    phoneNumber.characters.forEach {(character) in
        switch character {
        case "0"..."9":
            validPhoneNumber.characters.append(character)
        default:
            break
        }
    }

    if UIApplication.shared.canOpenURL(URL(string: "tel://\(validNumber)")!){
        UIApplication.shared.openURL(URL(string: "tel://\(validNumber)")!)
    }
3
répondu Emmett 2017-05-24 07:42:56

openURL () a été déprécié dans iOS 10. Voici la nouvelle syntaxe:

if let url = URL(string: "tel://\(busPhone)") {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
2
répondu Torre Lasley 2016-11-01 20:01:52

pour swift 3.0

if let url = URL(string: "tel://\(number)"), UIApplication.shared.canOpenURL(url) {
    if #available(iOS 10, *) {
        UIApplication.shared.open(url)
    } else {
        UIApplication.shared.openURL(url)
    }
}
else {
    print("Your device doesn't support this feature.")
}
1
répondu Hardik Thakkar 2017-10-13 11:17:07

Swift 3.0 solution:

let formatedNumber = phone.components(separatedBy: NSCharacterSet.decimalDigits.inverted).joined(separator: "")
print("calling \(formatedNumber)")
let phoneUrl = "tel://\(formatedNumber)"
let url:URL = URL(string: phoneUrl)!
UIApplication.shared.openURL(url)
0
répondu mazorati 2016-10-04 10:09:47

Voici une autre façon de réduire un numéro de téléphone à des composants valides en utilisant un Scanner ...

let number = "+123 456-7890"

let scanner = Scanner(string: number)

let validCharacters = CharacterSet.decimalDigits
let startCharacters = validCharacters.union(CharacterSet(charactersIn: "+#"))

var digits: NSString?
var validNumber = ""
while !scanner.isAtEnd {
    if scanner.scanLocation == 0 {
        scanner.scanCharacters(from: startCharacters, into: &digits)
    } else {
        scanner.scanCharacters(from: validCharacters, into: &digits)
    }

    scanner.scanUpToCharacters(from: validCharacters, into: nil)
    if let digits = digits as? String {
        validNumber.append(digits)
    }
}

print(validNumber)

// +1234567890
0
répondu Ashley Mills 2017-02-24 15:54:12

Swift 3.0 & iOS 10+

UIApplication.shared.openURL(url) a été changé pour UIApplication.shared.open(_ url: URL, options:[:], completionHandler completion: nil)

options et completion handler sont optionnels, rendant:

UIApplication.shared.open(url)

https://developer.apple.com/reference/uikit/uiapplication/1648685-open

0
répondu RLoniello 2017-03-28 21:40:11

pour une approche compatible Swift 3.1 & backwards, faites ceci:

@IBAction func phoneNumberButtonTouched(_ sender: Any) {
  if let number = place?.phoneNumber {
    makeCall(phoneNumber: number)
  }
}

func makeCall(phoneNumber: String) {
   let formattedNumber = phoneNumber.components(separatedBy: 
   NSCharacterSet.decimalDigits.inverted).joined(separator: "")

   let phoneUrl = "tel://\(formattedNumber)"
   let url:NSURL = NSURL(string: phoneUrl)!

   if #available(iOS 10, *) {
      UIApplication.shared.open(url as URL, options: [:], completionHandler: 
      nil)
   } else {
     UIApplication.shared.openURL(url as URL)
   }
}
0
répondu Lauren Roth 2017-09-19 05:15:03

Si votre numéro de téléphone contient des espaces, enlever d'abord! Ensuite, vous pouvez utiliser la solution de la réponse acceptée .

let numbersOnly = busPhone.replacingOccurrences(of: " ", with: "")

if let url = URL(string: "tel://\(numbersOnly)"), UIApplication.shared.canOpenURL(url) {
    if #available(iOS 10, *) {
        UIApplication.shared.open(url)
    } else {
        UIApplication.shared.openURL(url)
    }
}
0
répondu iOSdev 2018-03-14 13:56:16