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)!)
}
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
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.
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()
}
}
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)
}
}
}
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)
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)
}
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)
}
}
}
Dans Swift 3,
if let url = URL(string:"tel://\(phoneNumber)"), UIApplication.shared.canOpenURL(url) {
UIApplication.shared.openURL(url)
}
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
}
}
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)")!)
}
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)
}
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.")
}
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)
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
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
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)
}
}
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)
}
}