Ligar para um número de telefone rapidamente


90

Estou tentando ligar para um número não usando números específicos, mas um número que está sendo chamado em uma variável ou pelo menos dizer a ele para puxar o número no seu telefone. Esse número que está sendo chamado em uma variável é um número que recuperei usando um analisador ou pegando de um sql de site. Fiz um botão tentando ligar para o número de telefone armazenado na variável com uma função mas sem sucesso. Qualquer coisa vai ajudar, obrigado!

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

        }

Respostas:


193

Apenas tente:

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

presumindo que o número de telefone esteja em busPhone.

NSURL's init(string:)retorna um Optional, portanto, ao usá- if letlo, certificamo-nos de que urlé um NSURL(e não NSURL?como retornado por 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)
    }
}

Precisamos verificar se estamos no iOS 10 ou posterior porque:

'openURL' foi descontinuado no iOS 10.0


isso está me dando um erro de identificador não resolvido 'url' - apontando para o .openURL (url). Obrigado pela ajuda!
Thomas Martinez

nvm estava faltando apenas uma carta. Ok, então quando eu aperto o botão, nada acontece. aqui está mais informações ---------- func parserDidEndDocument (parser: NSXMLParser!) {println (busPhone) drawUpdatedView ()}
Thomas Martinez

1
Você está testando isso em um telefone? Suspeito que abrir um tel: // URL só funcionará em um iPhone real, não no simulador e não em um iPod ou iPad.
Thomas Müller

Sim, estou testando em um iphone 4s, o botão clica, mas não puxa o número chamado pelo busPhone de um servidor sql no meu telefone. Quando eu uso o tel: // com um número de telefone, ele disca.
Thomas Martinez

2
Ok, acho que sei qual é o problema, mas não sei como corrigi-lo. O número que está sendo extraído do URL está exatamente escrito como 123 456-7890 e não como 1234567890. Como faço para traduzir tel: // para ler o URL na forma que ele reconhecerá?
Thomas Martinez

66

Uma solução independente no 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)
    }
  }
}

Você deve ser capaz de usar callNumber("7178881234")para fazer uma chamada.


ele dará o erro como abaixo; "Este aplicativo não tem permissão para consultar o esquema tel" para o swift 3 e funciona no simulador ou não?
Kiran jadhav

1
Esse código não funcionará no simulador. Se você quiser verificar, use um dispositivo.
Ramakrishna

24

Swift 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 ou mais antigo

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

Ok, recebi ajuda e descobri. Além disso, coloquei um pequeno sistema de alerta legal para o caso de o número de telefone não ser válido. Meu problema era que eu estava ligando certo, mas o número tinha espaços e caracteres indesejados, como ("123 456-7890"). UIApplication só funciona ou aceita se o seu número for ("1234567890"). Então você basicamente remove o espaço e os caracteres inválidos criando uma nova variável para extrair apenas os números. Em seguida, liga para esses números com o 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.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
Você também deve permitir o sinal '+', eu acho.
florian

1
Também # é um dos caracteres usados ​​na hora de fazer solicitações :)
O iOSDev

9

As respostas acima estão parcialmente corretas, mas com "tel: //" há apenas um problema. Após o término da ligação, ela retornará à tela inicial, não ao nosso aplicativo. Portanto, é melhor usar "telprompt: //", ele retornará ao aplicativo.

var url:NSURL = NSURL(string: "telprompt://1234567891")!
UIApplication.sharedApplication().openURL(url)

Aparentemente, seu aplicativo será rejeitado
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: nilsão os argumentos padrão, você pode omiti-los.
Tim Vermeulen,

7

Estou usando esse método em meu aplicativo e está funcionando bem. Espero que isso possa ajudá-lo também.

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

7

Swift 5: iOS> = 10.0

Funciona apenas no dispositivo físico.

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

Alguém abaixo diz que se você usar "telprompt" em vez de "tel", seu aplicativo será rejeitado.
Andy Weinstein de

@AndyWeinstein eh talvez se eles pegarem, mas eles não rejeitaram nenhum dos meus
grantespo

4

Em Swift 3,

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

4

Estou usando a solução swift 3 com validação de número

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 é uma atualização da resposta de @Tom usando Swift 2.0 Nota - Esta é toda a classe CallComposer que estou 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 () tornou-se obsoleto no iOS 10. Aqui está a nova sintaxe:

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

1
não é depreciado. a mudança na sintaxe é porque você está usando o swift 3.
Hammadzafar

@Hammadzafar, o método openURl (url) está realmente obsoleto. A nova versão dele tem uma assinatura diferente e também foi renomeada para abrir (url: options: completedHandler)
imita

isso porque o swift 2.3 logo será depreciado
Hammadzafar

2

Muitas das outras respostas não funcionam para o Swift 5. Abaixo está a atualização do código para o 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)
    }
}

PS:

  1. Com a maioria das respostas, não consegui obter o prompt do dispositivo. O código acima foi capaz de exibir o prompt com sucesso.
  2. Não há // após tel: como a maioria das respostas. E funciona bem.

1

Solução 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)

também remove '+' e '#' char
Amr Angry

1

Esta é uma maneira alternativa de reduzir um número de telefone a componentes válidos usando um 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 e 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
Embora este snippet de código possa resolver a questão, incluir uma explicação realmente ajuda a melhorar a qualidade de sua postagem. Lembre-se de que você está respondendo à pergunta para leitores no futuro, e essas pessoas podem não saber os motivos de sua sugestão de código. Tente também não sobrecarregar seu código com comentários explicativos, isso reduz a legibilidade do código e das explicações!
Rohan Khude


0

Para uma abordagem compatível com Swift 3.1 e versões anteriores, faça o seguinte:

@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

Se o seu número de telefone contiver espaços, remova-os primeiro! Então você pode usar a solução da resposta aceita .

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 pergunta agora contém 17 respostas e tem mais de 3 anos. Por que você achou necessário acrescentar mais uma resposta?
Fogmeister

1
Porque não entendi porque não funciona se um número de telefone contém espaço. Não seja tão negativo, senhor meister!
catanore

Definitivamente entendo isso. Portanto, adicione uma nova pergunta explicitamente sobre espaços em números e adicione sua própria resposta a ela. Não há nada de errado em fazer uma pergunta e respondê-la você mesmo. (Embora eu tenha certeza de que a questão seria encerrada como uma duplicata).
Fogmeister

1
Não, é importante dizer às pessoas aqui porque o url não está aberto: porque é nulo, porque o número de telefone contém espaços. O que eu concordo, isso deve ser mais um comentário do que uma resposta. Mas há muitos comentários lá.
catanore

A menção de espaços te ajudou?
catanore
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.