Llamar a un número de teléfono rápido

Intento llamar a un número que no utiliza números específicos, sino un número al que se llama en una variable o, al menos, le digo que descuelgue el número en su teléfono. Este número que se llama en una variable es un número que recuperé usando un analizador sintáctico o un acaparamiento de un sitio web sql. Hice un botón tratando de llamar al número de teléfono almacenado en la variable con una función pero fue en vano. ¡Cualquier cosa ayudará gracias!

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)!) } 

Sólo inténtalo:

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

asumiendo que el número de teléfono está en busPhone .

El init(string:) NSURL init(string:) devuelve un Opcional, por lo que al usar if let asegurarnos de que la url sea ​​un NSURL (y no un NSURL? Como lo devuelve el init ).


Para 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) } } 

Necesitamos comprobar si estamos en iOS 10 o posterior porque:

‘openURL’ ha quedado obsoleto en iOS 10.0

Una solución autónoma en iOS 10, 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) } } } 

Debería poder usar callNumber("7178881234") para hacer una llamada.

De acuerdo, obtuve ayuda y lo descubrí. También puse un pequeño y agradable sistema de alerta solo en caso de que el número de teléfono no sea válido. Mi problema era que estaba llamando bien, pero el número tenía espacios y caracteres no deseados como (“123 456-7890”). UIApplication solo funciona o acepta si su número es (“1234567890”). Así que básicamente elimina el espacio y los caracteres no válidos creando una nueva variable para extraer solo los números. Luego llama esos números con la aplicación UIA.

 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 y ios 10 o más

 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) } } } 

Las respuestas anteriores son parcialmente correctas, pero con “tel: //” solo hay un problema. Una vez que finaliza la llamada, volverá a la pantalla de inicio, no a nuestra aplicación. Así que es mejor usar “telprompt: //”, volverá a la aplicación.

 var url:NSURL = NSURL(string: "telprompt://1234567891")! UIApplication.sharedApplication().openURL(url) 

Estoy usando este método en mi aplicación y está funcionando bien. Espero que esto también te pueda ayudar.

 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) } } } 

En Swift 3,

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

Esta es una actualización de la respuesta de @ Tom usando Swift 2.0. Nota : Esta es toda la clase de CallComposer que estoy usando.

 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 } } 

Estoy usando solución swift 3 con validación de número

 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 () ha quedado obsoleto en iOS 10. Aquí está la nueva syntax:

 if let url = URL(string: "tel://\(busPhone)") { UIApplication.shared.open(url, options: [:], completionHandler: nil) } 

Por veloz 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.") } 

Solución Swift 3.0:

 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) 

Aquí hay una forma alternativa de reducir un número de teléfono a componentes válidos usando 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 y iOS 10+

UIApplication.shared.openURL(url) se cambió a UIApplication.shared.open(_ url: URL, options:[:], completionHandler completion: nil)

las opciones y el controlador de finalización son opcionales, lo que representa:

UIApplication.shared.open(url)

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

Para un enfoque compatible con versiones anteriores de Swift 3.1, haz lo siguiente:

 @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 su número de teléfono contiene espacios, ¡elimínelos primero! Luego puede usar la solución de la respuesta aceptada .

 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) } }