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

        }
Thomas Martinez
fonte

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

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

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

            }
        }
    }
}
Teja
fonte
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)
        }
    }
}
Gandom
fonte
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()
        }
        }
Thomas Martinez
fonte
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)
Dipen Gajjar
fonte
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)
            }
        }
  }
LuAndre
fonte
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)
}
Ayath Khan
fonte
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)
}
grantespo
fonte
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)
}
Venk
fonte
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)")!)
    }
Emmett
fonte
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
 }
}
Michael McKenna
fonte
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)
}
Torre Lasley
fonte
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.
Mahendra Liya
fonte
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)
mazorati
fonte
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
Ashley Mills
fonte
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
fonte
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)
}
iHarshil
fonte
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
fonte
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

Swift 3.0 e iOS 10+

UIApplication.shared.openURL(url) foi alterado para UIApplication.shared.open(_ url: URL, options:[:], completionHandler completion: nil)

opções e manipulador de conclusão são opcionais, renderizando:

UIApplication.shared.open(url)

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

RLoniello
fonte
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)
   }
}
Lauren Roth
fonte
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)
    }
}
catanora
fonte
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