Chiamare un numero di telefono rapidamente


89

Sto cercando di chiamare un numero non utilizzando numeri specifici ma un numero che viene chiamato in una variabile o almeno gli dico di richiamare il numero nel telefono. Questo numero che viene chiamato in una variabile è un numero che ho recuperato utilizzando un parser o recuperando da un sito web sql. Ho creato un pulsante cercando di chiamare il numero di telefono memorizzato nella variabile con una funzione ma senza alcun risultato. Qualunque cosa aiuterà, grazie!

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

        }

Risposte:


191

Prova:

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

supponendo che il numero di telefono sia in busPhone.

NSURL'S init(string:) restituisce un optional, in modo da utilizzare if letci assicuriamo che urlè una NSURL(e non una NSURL?come restituito dal init).


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

Dobbiamo verificare se siamo su iOS 10 o versioni successive perché:

"openURL" è stato deprecato in iOS 10.0


questo mi sta dando un errore di identificatore irrisolto "url" - che punta verso .openURL (url) Grazie per l'aiuto a proposito!
Thomas Martinez

nvm mi mancava solo una lettera. va bene così quando premo il pulsante non succede nulla. ecco maggiori informazioni ---------- func parserDidEndDocument (parser: NSXMLParser!) {println (busPhone) drawUpdatedView ()}
Thomas Martinez

1
Lo stai testando su un telefono? Sospetto che l'apertura di un tel: // URL funzionerà solo su un iPhone reale, non nel simulatore e non su un iPod o iPad.
Thomas Müller

Sì, lo sto testando su un iPhone 4s, il pulsante fa clic ma non richiama il numero chiamato da busPhone da un server sql sul mio telefono. Quando uso il tel: // con un numero di telefono, lo compone.
Thomas Martinez

2
Ok, penso di sapere qual è il problema ma non so come risolverlo. Il numero che viene estratto dall'URL è scritto esattamente come questo 123 456-7890 e non come questo 1234567890. Come traduco il tel: // per leggere l'URL nella forma che riconoscerà?
Thomas Martinez

66

Una soluzione autonoma in 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)
    }
  }
}

Dovresti essere in grado di utilizzare callNumber("7178881234")per effettuare una chiamata.


darà l'errore come sotto; "Questa app non è autorizzata a interrogare lo schema tel" per swift 3 e funzionano sul simulatore o no?
Kiran jadhav

1
Quel codice non funzionerà nel simulatore. Se vuoi verificarlo usa un 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 o versioni precedenti

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, ho ricevuto aiuto e l'ho capito. Inoltre ho inserito un bel sistema di allerta nel caso in cui il numero di telefono non fosse valido. Il mio problema era che lo chiamavo correttamente, ma il numero conteneva spazi e caratteri indesiderati come ("123 456-7890"). UIApplication funziona o accetta solo se il tuo numero è ("1234567890"). Quindi in pratica rimuovi lo spazio ei caratteri non validi creando una nuova variabile per estrarre solo i numeri. Quindi chiama quei numeri con l'applicazione 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
Dovresti anche consentire il segno "+" credo.
florian

1
Inoltre # è uno dei caratteri utilizzati al momento delle richieste :)
L'iOSDev

9

Le risposte precedenti sono parzialmente corrette, ma con "tel: //" c'è solo un problema. Dopo che la chiamata è terminata, tornerà alla schermata iniziale, non alla nostra app. Quindi è meglio usare "telprompt: //", tornerà all'app.

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

Apparentemente in questo modo la tua app verrà rifiutata
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: nilsono gli argomenti predefiniti, puoi ometterli.
Tim Vermeulen

7

Sto usando questo metodo nella mia applicazione e funziona bene. Spero che questo possa aiutare anche te.

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

Funziona solo su dispositivi fisici.

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

Qualcuno sotto dice che se usi "telprompt" invece di "tel" la tua app verrà rifiutata.
Andy Weinstein il

@ AndyWeinstein eh forse se lo prendono, ma non hanno rifiutato nessuno dei miei
grantespo

4

In Swift 3,

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

4

Sto usando la soluzione rapida 3 con convalida del numero

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

Questo è un aggiornamento alla risposta di @Tom con Swift 2.0 Nota - Questa è l'intera classe CallComposer che sto 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 () è stato deprecato in iOS 10. Ecco la nuova sintassi:

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

1
non è ammortizzato. il cambiamento di sintassi è dovuto al fatto che stai utilizzando
Swift

@Hammadzafar, il metodo openURl (url) è davvero deprecato. La nuova versione ha una firma diversa ed è stata anche rinominata in open (url: options: completamentoHandler)
imita il

questo perché Swift 2.3 sarà presto ammortizzato
Hammadzafar

2

Molte delle altre risposte non funzionano per Swift 5. Di seguito è riportato l'aggiornamento del codice a 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. Con la maggior parte delle risposte, non sono riuscito a ottenere il prompt sul dispositivo. Il codice precedente è stato in grado di visualizzare correttamente il prompt.
  2. Non c'è // dopo tel: come la maggior parte delle risposte. E funziona bene.

1

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

rimuove anche i caratteri "+" e "#"
Amr Angry

1

Ecco un modo alternativo per ridurre un numero di telefono a componenti validi utilizzando 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

Per 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

Per Swift 4.2 e versioni successive

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
Sebbene questo frammento di codice possa risolvere la domanda, includere una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e quelle persone potrebbero non conoscere i motivi del tuo suggerimento sul codice. Cerca anche di non affollare il tuo codice con commenti esplicativi, questo riduce la leggibilità sia del codice che delle spiegazioni!
Rohan Khude


0

Per un approccio Swift 3.1 e compatibile con le versioni precedenti, procedi come segue:

@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 il tuo numero di telefono contiene spazi, rimuovili prima! Quindi puoi utilizzare la soluzione della risposta accettata .

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

Questa domanda ora contiene 17 risposte e ha più di 3 anni. Perché hai ritenuto necessario aggiungere un'altra risposta?
Fogmeister

1
Perché non ho capito perché non funziona se un numero di telefono contiene spazio. Non essere così negativo, signor meister!
catanore

Sicuramente capirlo. Quindi aggiungi una nuova domanda esplicitamente sugli spazi nei numeri e aggiungi la tua risposta. Non c'è niente di sbagliato nel fare una domanda e nel rispondere da soli. (Anche se sono abbastanza certo che la domanda sarebbe stata chiusa come un duplicato).
Fogmeister

1
No, è importante dire alle persone qui perché l'URL non è aperto: perché è nullo, perché il numero di telefono contiene spazi. Quello che sono d'accordo, che questo dovrebbe essere piuttosto un commento che una risposta. Ma ci sono troppi commenti lì.
catanore

La menzione degli spazi ti ha aiutato?
catanore
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.