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

        }
Thomas Martinez
fuente

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

Thomas Müller
fuente
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.

Zorayr
fuente
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)

            }
        }
    }
}
Teja
fuente
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)
        }
    }
}
Gandom
fuente
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()
        }
        }
Thomas Martinez
fuente
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)
Dipen Gajjar
fuente
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)
            }
        }
  }
LuAndre
fuente
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)
}
Ayath Khan
fuente
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)
}
grantespo
fuente
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)
}
Venk
fuente
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)")!)
    }
Emmett
fuente
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
 }
}
Michael McKenna
fuente
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)
}
Torre Lasley
fuente
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.
Mahendra Liya
fuente
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)
mazorati
fuente
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
Ashley Mills
fuente
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.")
}
Hardik Thakkar
fuente
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)
}
iHarshil
fuente
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)
Jithin Pankaj k
fuente
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)
   }
}
Lauren Roth
fuente
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)
    }
}
catanorar
fuente
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