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)!)
}
fonte
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.fonte
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) } } } }
fonte
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) } } }
fonte
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() } }
fonte
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)
fonte
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) } } }
fonte
options: [:], completionHandler: nil
são os argumentos padrão, você pode omiti-los.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) }
fonte
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) }
fonte
Em Swift 3,
if let url = URL(string:"tel://\(phoneNumber)"), UIApplication.shared.canOpenURL(url) { UIApplication.shared.openURL(url) }
fonte
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)")!) }
fonte
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 } }
fonte
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) }
fonte
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:
fonte
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)
fonte
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
fonte
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.") }
fonte
if let phoneCallURL = URL(string: "tel://\(01234567)"), UIApplication.shared.canOpenURL(phoneCallURL) { UIApplication.shared.open(phoneCallURL, options: [:], completionHandler: nil) }
fonte
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)
fonte
Swift 3.0 e iOS 10+
UIApplication.shared.openURL(url)
foi alterado paraUIApplication.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
fonte
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) } }
fonte
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) } }
fonte