¿Cómo usar openURL para hacer una llamada telefónica en Swift?

He convertido el código para hacer una llamada telefónica de Objective-C a Swift, pero en Objective-C, podemos establecer el tipo de URL que nos gusta abrir (por ejemplo, teléfono, SMS, web) de esta manera:

@"tel:xx" @"mailto:info@example.es" @"http://stackoverflow.com" @"sms:768number" 

El código en Swift es:

 UIApplication.sharedApplication().openURL(NSURL(string : "9809088798") 

Leí que no he publicado ningún parámetro de esquema para tel: , pero no sé si Swift puede detectar si la cadena es para hacer una llamada telefónica, enviar un correo electrónico o abrir un sitio web. O puedo escribir:

 (string : "tel//:9809088798") 

?

Estoy bastante seguro de que quieres:

 UIApplication.sharedApplication().openURL(NSURL(string: "tel://9809088798")!) 

(tenga en cuenta que en el texto de su pregunta, usted pone tel//: no tel:// ).

El inicio de cadena de NSURL espera una URL bien formada. No convertirá un montón de números en un número de teléfono. A veces se ve la detección del número de teléfono en UIWebView, pero eso se hace a un nivel más alto que NSURL.

EDITAR: ¡Agregado! por comentario a continuación

Una solución autónoma en Swift :

 private func callNumber(phoneNumber:String) { if let phoneCallURL:NSURL = NSURL(string:"tel://\(phoneNumber)") { let application:UIApplication = UIApplication.sharedApplication() if (application.canOpenURL(phoneCallURL)) { application.openURL(phoneCallURL); } } } 

Ahora, debería poder usar callNumber("7178881234") para hacer una llamada.

Para Swift en iOS:

 var url:NSURL? = NSURL(string: "tel://9809088798") UIApplication.sharedApplication().openURL(url!) 

Debes recordar eliminar los espacios en blanco o no funcionará:

 if let telephoneURL = NSURL(string: "telprompt://\(phoneNumber.stringByReplacingOccurrencesOfString(" ", withString: ""))") { UIApplication.sharedApplication().openURL(telelphoneURL) } 

“telprompt: //” pedirá al usuario que llame o se cancele mientras “tel: //” llamará directamente.

@ confile:

El problema es que su solución no regresa a la aplicación después de que la llamada telefónica haya finalizado en iOS7. – 19 de junio a las 13:50

& @ Zorayr

Hm, curioso si hay una solución que sí lo haga … podría ser una restricción en iOS.

utilizar

 UIApplication.sharedApplication().openURL(NSURL(string: "telprompt://9809088798")!) 

Recibirá un mensaje para Llamar / Cancelar pero regresará a su aplicación. AFAIK no hay forma de regresar (sin preguntar)

Debes insertar “+” \ es otra manera

 private func callNumber(phoneNumber:String) { if let phoneCallURL:NSURL = NSURL(string:"tel://"+"\(phoneNumber)") { let application:UIApplication = UIApplication.sharedApplication() if (application.canOpenURL(phoneCallURL)) { application.openURL(phoneCallURL); } } } 

Pequeña actualización de Swift 3

 UIApplication.shared.openURL(NSURL(string: "telprompt://9809088798")! as URL) 

El siguiente fragmento de código puede indicar si la tarjeta SIM está allí o no y si el dispositivo es capaz de realizar la llamada y si está bien, hará la llamada.

  var info = CTTelephonyNetworkInfo() var carrier = info.subscriberCellularProvider if carrier != nil && carrier.mobileNetworkCode == nil || carrier.mobileNetworkCode.isEqual("") { //SIM is not there in the phone } else if UIApplication.sharedApplication().canopenURL(NSURL(string: "tel://9809088798")!) { UIApplication.sharedApplication().openURL(NSURL(string: "tel://9809088798")!) } else { //Device does not have call making capability } 

Para veloz 3

 if let phoneCallURL:URL = URL(string:"tel://\(phoneNumber ?? "")") { let application:UIApplication = UIApplication.shared if (application.canOpenURL(phoneCallURL)) { application.open(phoneCallURL, options: [:], completionHandler: nil); } } 

Para swift 4:

 func call(phoneNumber: String) { if let url = URL(string: phoneNumber) { if #available(iOS 10, *) { UIApplication.shared.open(url, options: [:], completionHandler: { (success) in print("Open \(phoneNumber): \(success)") }) } else { let success = UIApplication.shared.openURL(url) print("Open \(phoneNumber): \(success)") } } } 

Entonces, usa la función:

 let phoneNumber = "tel://+132342424" call(phoneNumber: phoneNumber)