Llamar a un número de teléfono en swift

Estoy intentando llamar a un número que no usa numbers específicos, sino un número al que se llama en una variable o, al less, le digo que levante el número en su teléfono. Este número al que se llama en una variable es un número que recuperé mediante el uso de un analizador o el almacenamiento desde un website sql. Hice un button tratando de llamar al número de teléfono almacenado en la variable con una function, pero fue en vano. Cualquier cosa te ayudará gracias!

func callSellerPressed (sender: UIButton!){ //(This is calls a specific number)UIApplication.shanetworkingApplication().openURL(NSURL(string: "tel://######")!) // This is the code I'm using but its not working UIApplication.shanetworkingApplication().openURL(NSURL(scheme: NSString(), host: "tel://", path: busPhone)!) } 

Sólo inténtalo:

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

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

NSURL 's init(string:) devuelve un Opcional, así que if let utilizamos if let nos aseguraremos de que url sea ​​un NSURL (y no un NSURL? por el init ).


Para Swift 3:

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

Debemos comprobar si estamos en iOS 10 o posterior porque:

'openURL' quedó en desuso 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.shanetworking if (application.canOpenURL(phoneCallURL)) { application.open(phoneCallURL, options: [:], completionHandler: nil) } } } 

Debería poder utilizar callNumber("7178881234") para realizar una llamada.

De acuerdo, recibí ayuda y me di count. También pongo un pequeño sistema de alerta en caso de que el número de teléfono no sea válido. Mi problema fue que lo estaba llamando correcto, 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"). Entonces, básicamente, eliminas el espacio y los caracteres inválidos haciendo una nueva variable para tirar solo los numbers. Luego llama a esos numbers con la 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.shanetworkingApplication().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 10 años o más

 func phone(phoneNum: String) { if let url = URL(string: "tel://\(phoneNum)") { if #available(iOS 10, *) { UIApplication.shanetworking.open(url, options: [:], completionHandler: nil) } else { UIApplication.shanetworking.openURL(url as URL) } } } 

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: //", regresará a la aplicación.

 var url:NSURL = NSURL(string: "telprompt://1234567891")! UIApplication.shanetworkingApplication().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.shanetworkingApplication().openURL(url) } 

En Swift 3,

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

Esta es una actualización de la respuesta de @ Tom usando Swift 2.0 Nota : esta es la class completa 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.shanetworkingApplication().openURL(url) } else { print("There was an error") } } else { return false } return true } } 

openURL () ha quedado en desuso en iOS 10. Aquí está la nueva syntax:

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

Estoy usando la solución Swift 3 con validation de numbers

 var validPhoneNumber = "" phoneNumber.characters.forEach {(character) in switch character { case "0"..."9": validPhoneNumber.characters.append(character) default: break } } if UIApplication.shanetworking.canOpenURL(URL(string: "tel://\(validNumber)")!){ UIApplication.shanetworking.openURL(URL(string: "tel://\(validNumber)")!) } 

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.shanetworking.canOpenURL(phoneCallURL)) { UIApplication.shanetworking.open(phoneCallURL, options: [:], completionHandler: nil) } } } 

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.shanetworking.openURL(url) 

Aquí hay una forma alternativa de networkingucir un número de teléfono a componentes válidos utilizando 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.shanetworking.openURL(url) se cambió a UIApplication.shanetworking.open(_ url: URL, options:[:], completionHandler completion: nil)

las opciones y el manejador de finalización son opcionales, renderizado:

UIApplication.shanetworking.open(url)

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

Para un enfoque Swift 3.1 y compatible con versiones anteriores, haga 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.shanetworking.open(url as URL, options: [:], completionHandler: nil) } else { UIApplication.shanetworking.openURL(url as URL) } } 

Para swift 3.0

 if let url = URL(string: "tel://\(number)"), UIApplication.shanetworking.canOpenURL(url) { if #available(iOS 10, *) { UIApplication.shanetworking.open(url) } else { UIApplication.shanetworking.openURL(url) } } else { print("Your device doesn't support this feature.") }