Estoy tratando de llamar a un número que no usa números específicos, sino un número al que se llama en una variable o al menos decirle que muestre 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 o tomándolo 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)!)
}
fuente
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 utilizar
callNumber("7178881234")
para realizar una llamada.fuente
Rápido 4,
private func callNumber(phoneNumber:String) { if let phoneCallURL = URL(string: "telprompt://\(phoneNumber)") { let application:UIApplication = UIApplication.shared if (application.canOpenURL(phoneCallURL)) { if #available(iOS 10.0, *) { application.open(phoneCallURL, options: [:], completionHandler: nil) } else { // Fallback on earlier versions application.openURL(phoneCallURL as URL) } } } }
fuente
Swift 3.0 e ios 10 o anterior
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) } } }
fuente
De acuerdo, obtuve ayuda y lo resolví. También instalé un pequeño y agradable sistema de alerta en caso de que el número de teléfono no sea válido. Mi problema era que lo 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"). Básicamente, elimina el espacio y los caracteres no válidos creando una nueva variable para extraer solo los números. Luego llama a 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() } }
fuente
Las respuestas anteriores son parcialmente correctas, pero con "tel: //" solo hay un problema. Una vez finalizada 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)
fuente
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) } } }
fuente
options: [:], completionHandler: nil
son los argumentos predeterminados, puede omitirlos.Estoy usando este método en mi aplicación y está funcionando bien. Espero que esto también te ayude.
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) }
fuente
Swift 5: iOS> = 10.0
Solo funciona en dispositivos físicos.
private func callNumber(phoneNumber: String) { guard let url = URL(string: "telprompt://\(phoneNumber)"), UIApplication.shared.canOpenURL(url) else { return } UIApplication.shared.open(url, options: [:], completionHandler: nil) }
fuente
En Swift 3,
if let url = URL(string:"tel://\(phoneNumber)"), UIApplication.shared.canOpenURL(url) { UIApplication.shared.openURL(url) }
fuente
Estoy usando la solución Swift 3 con validación numérica
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)")!) }
fuente
Esta es una actualización de la respuesta de @ Tom usando Swift 2.0 Nota : esta es toda la clase 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 } }
fuente
openURL () ha quedado obsoleto en iOS 10. Aquí está la nueva sintaxis:
if let url = URL(string: "tel://\(busPhone)") { UIApplication.shared.open(url, options: [:], completionHandler: nil) }
fuente
Muchas de las otras respuestas no funcionan para Swift 5. A continuación se muestra la actualización del código para Swift 5:
let formattedNumber = phoneNumberVariable.components(separatedBy: NSCharacterSet.decimalDigits.inverted).joined(separator: "") if let url = NSURL(string: ("tel:" + (formattedNumber)!)) { if #available(iOS 10.0, *) { UIApplication.shared.open(url as URL, options: [:], completionHandler: nil) } else { UIApplication.shared.openURL(url as URL) } }
PD:
fuente
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)
fuente
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
fuente
Para 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.") }
fuente
if let phoneCallURL = URL(string: "tel://\(01234567)"), UIApplication.shared.canOpenURL(phoneCallURL) { UIApplication.shared.open(phoneCallURL, options: [:], completionHandler: nil) }
fuente
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)
fuente
Swift 3.0 y iOS 10+
UIApplication.shared.openURL(url)
fue cambiado aUIApplication.shared.open(_ url: URL, options:[:], completionHandler completion: nil)
las opciones y el controlador de finalización son opcionales y representan:
UIApplication.shared.open(url)
https://developer.apple.com/reference/uikit/uiapplication/1648685-open
fuente
Para un enfoque Swift 3.1 y compatible con versiones anteriores, haga esto:
@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) } }
fuente
Si su número de teléfono contiene espacios, ¡elimínelos primero! Entonces puede usar la solución de 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) } }
fuente