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


89

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

        }

Respuestas:


191

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.

NSURL'S init(string:)devuelve un opcional, por lo que mediante el uso if letnos aseguramos de que urles una NSURL(y no un NSURL?devuelto por 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 verificar si estamos en iOS 10 o posterior porque:

'openURL' quedó obsoleto en iOS 10.0


esto me está dando un error de identificador 'url' sin resolver - apuntando hacia .openURL (url) ¡Gracias por la ayuda por cierto!
Thomas Martinez

nvm solo me faltaba una letra. bien, cuando presiono el botón no pasa nada. aquí hay más información ---------- func parserDidEndDocument (parser: NSXMLParser!) {println (busPhone) drawUpdatedView ()}
Thomas Martinez

1
¿Estás probando esto en un teléfono? Sospecho que abrir una URL tel: // solo funcionará en un iPhone real, no en el simulador y no en un iPod o iPad.
Thomas Müller

Sí, lo estoy probando en un iphone 4s, el botón hace clic, pero no muestra el número llamado por busPhone desde un servidor SQL en mi teléfono. Cuando utilizo el tel: // con un número de teléfono, lo marca.
Thomas Martinez

2
Bien, creo que sé cuál es el problema, pero no sé cómo solucionarlo. El número que se extrae de la URL está escrito exactamente así 123 456-7890 y no así 1234567890. ¿Cómo traduzco el tel: // para leer la URL en la forma que reconocerá?
Thomas Martinez

66

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.


dará error como se muestra a continuación; "Esta aplicación no puede consultar el esquema tel" para swift 3 y ¿funcionan en el simulador o no?
Kiran jadhav

1
Ese código no funcionará en el simulador. Si desea comprobarlo, utilice un dispositivo.
Ramakrishna

24

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)

            }
        }
    }
}

13

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

9

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

6
También debería permitir el signo '+', creo.
florian

1
También # es uno de los caracteres utilizados al momento de realizar solicitudes :)
iOSDev

9

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)

Aparentemente, esto hará que su aplicación sea rechazada
Tom Knapen

8

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

options: [:], completionHandler: nilson los argumentos predeterminados, puede omitirlos.
Tim Vermeulen

7

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

6

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

Alguien a continuación dice que si usa "telprompt" en lugar de "tel", su aplicación será rechazada.
Andy Weinstein

@AndyWeinstein eh tal vez si lo atrapan, pero no han rechazado ninguno de los míos
grantespo

4

En Swift 3,

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

4

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

3

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

2

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

1
no está depreciado. el cambio en la sintaxis se debe a que está usando
Swift

@Hammadzafar, el método openURl (url) está realmente en desuso. La nueva versión tiene una firma diferente y también ha sido renombrada para abrir (url: options: deploymentHandler)
imitar el

Eso

2

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:

  1. Con la mayoría de las respuestas, no pude obtener el mensaje en el dispositivo. El código anterior pudo mostrar correctamente el mensaje.
  2. No hay // después de tel: como la mayoría de las respuestas. Y funciona bien.

1

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)

también elimina los caracteres '+' y '#'
Amr Angry

1

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

1

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

1

Para Swift 4.2 y superior

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

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

2
Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo a la pregunta para los lectores en el futuro, y es posible que esas personas no conozcan los motivos de su sugerencia de código. Por favor, trate también de no llenar su código con comentarios explicativos, ¡esto reduce la legibilidad tanto del código como de las explicaciones!
Rohan Khude


0

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

0

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

Esta pregunta ahora contiene 17 respuestas y tiene más de 3 años. ¿Por qué consideró necesario agregar otra respuesta?
Fogmeister

1
Porque no entendí por qué no funciona si un número de teléfono contiene espacio. ¡No sea tan negativo, señor maestro!
catanore

Definitivamente entiendo eso. Por lo tanto, agregue una nueva pregunta explícitamente sobre los espacios en los números y agregue su propia respuesta. No hay nada de malo en hacer una pregunta y responderla usted mismo. (Aunque, estoy bastante seguro de que esa pregunta se cerrará como un duplicado).
Fogmeister

1
No, es importante decirle a la gente aquí por qué no se abre la URL: porque es nula, porque el número de teléfono contiene espacios. En lo que estoy de acuerdo, en que esto debería ser más un comentario que una respuesta. Pero hay demasiados comentarios ahí.
catanore

¿Te ayudó la mención de espacios?
catanore
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.