Schnell eine Telefonnummer anrufen


87

Ich versuche, eine Nummer anzurufen, die keine bestimmten Nummern verwendet, sondern eine Nummer, die in einer Variablen angerufen wird, oder sie zumindest anzuweisen, die Nummer in Ihrem Telefon aufzurufen. Diese Nummer, die in einer Variablen aufgerufen wird, ist eine Nummer, die ich mithilfe eines Parsers oder durch Abrufen von einer Website-SQL abgerufen habe. Ich habe eine Taste gedrückt, um die in der Variablen gespeicherte Telefonnummer mit einer Funktion anzurufen, aber ohne Erfolg. Alles wird helfen, danke!

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

        }

Antworten:


190

Probier's einfach:

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

vorausgesetzt, die Telefonnummer ist in busPhone .

NSURL's init(string:)gibt ein Optional zurück. Wenn if letwir also verwenden, stellen wir sicher, dass urles sich um ein NSURL(und nicht um ein NSURL?von init) zurückgegebenes handelt.


Für 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)
    }
}

Wir müssen überprüfen, ob wir iOS 10 oder höher verwenden, weil:

'openURL' war in iOS 10.0 veraltet


Dies gibt mir einen Fehler der ungelösten Kennung 'url' - zeigt auf die .openURL (url). Danke übrigens für die Hilfe!
Thomas Martinez

nvm mir fehlte nur ein brief. Okay, wenn ich den Knopf drücke, passiert nichts. Hier gibt es weitere Informationen ---------- func parserDidEndDocument (Parser: NSXMLParser!) {println (busPhone) drawUpdatedView ()}
Thomas Martinez

1
Testen Sie dies auf einem Telefon? Ich vermute, dass das Öffnen einer tel: // URL nur auf einem tatsächlichen iPhone funktioniert, nicht im Simulator und nicht auf einem iPod oder iPad.
Thomas Müller

Ja, ich teste es auf einem iPhone 4s. Die Taste klickt, aber die von busPhone angerufene Nummer wird nicht von einem SQL Server auf meinem Telefon abgerufen. Wenn ich das tel: // mit einer Telefonnummer benutze, wählt es es.
Thomas Martinez

2
Okay, ich glaube ich weiß was das Problem ist, aber ich weiß nicht wie ich es beheben soll. Die Nummer, die von der URL abgerufen wird, ist genau so geschrieben: 123 456-7890 und nicht so 1234567890. Wie übersetze ich das Tel: //, um die URL in der Form zu lesen, die sie erkennt?
Thomas Martinez

66

Eine eigenständige Lösung 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)
    }
  }
}

Sie sollten in der Lage sein callNumber("7178881234"), einen Anruf zu tätigen.


es wird Fehler wie unten geben; "Diese App darf nicht nach Schema Tel abfragen" für Swift 3 und funktionieren diese auf dem Simulator oder nicht?
Kiran Jadhav

1
Dieser Code funktioniert im Simulator nicht. Wenn Sie es überprüfen möchten, verwenden Sie ein Gerät.
Ramakrishna

22

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 und ios 10 oder älter

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

Okay, ich habe Hilfe bekommen und es herausgefunden. Außerdem habe ich ein nettes kleines Warnsystem eingerichtet, falls die Telefonnummer nicht gültig ist. Mein Problem war, dass ich es richtig anrief, aber die Nummer hatte Leerzeichen und unerwünschte Zeichen wie ("123 456-7890"). UIApplication funktioniert oder akzeptiert nur, wenn Ihre Nummer ("1234567890") lautet. Sie entfernen also im Grunde das Leerzeichen und ungültige Zeichen, indem Sie eine neue Variable erstellen, um nur die Zahlen abzurufen. Ruft dann diese Nummern mit der UIApplication auf.

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
Sie sollten auch das Pluszeichen "+" zulassen, denke ich.
Florian

1
Auch # ist eines der Zeichen, die zum Zeitpunkt der Anforderung verwendet wurden :)
Der iOSDev

9

Die obigen Antworten sind teilweise richtig, aber mit "tel: //" gibt es nur ein Problem. Nachdem der Anruf beendet wurde, kehrt er zum Startbildschirm zurück, nicht zu unserer App. Wenn Sie also "telprompt: //" verwenden, kehren Sie zur App zurück.

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

Anscheinend wird dies Ihre App abgelehnt
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: nilSind die Standardargumente, können Sie sie weglassen.
Tim Vermeulen

7

Ich verwende diese Methode in meiner Anwendung und sie funktioniert einwandfrei. Ich hoffe das kann dir auch helfen.

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

4

In Swift 3

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

4

Ich verwende eine Swift 3-Lösung mit Nummernvalidierung

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

4

Swift 5: iOS> = 10.0

Funktioniert nur auf physischen Geräten.

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

3

Dies ist ein Update von @ Toms Antwort mit Swift 2.0. Hinweis - Dies ist die gesamte CallComposer-Klasse, die ich verwende.

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 () ist in iOS 10 veraltet. Hier ist die neue Syntax:

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

1
es ist nicht abgeschrieben. Die Änderung in der Syntax ist, weil Sie Swift 3 verwenden.
Hammadzafar

@Hammadzafar, openURl (url) -Methode ist wirklich veraltet. Die neue Version hat eine andere Signatur und wurde auch in open umbenannt (url: options: finishHandler)
imitiert den

Das liegt daran, dass Swift 2.3 bald abgeschrieben wird
Hammadzafar,

1

Swift 3.0-Lösung:

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)

es entfernt auch '+' und '#' char
Amr Angry

1

Hier ist eine alternative Möglichkeit, eine Telefonnummer mithilfe eines 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

Für schnelle 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

Für Swift 4.2 und höher

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
Während dieses Code-Snippet die Frage lösen kann, hilft das Hinzufügen einer Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch, Ihren Code nicht mit erklärenden Kommentaren zu überfüllen. Dies verringert die Lesbarkeit sowohl des Codes als auch der Erklärungen!
Rohan Khude

1

Viele der anderen Antworten funktionieren nicht für Swift 5. Nachfolgend finden Sie das Code-Update für 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. Bei den meisten Antworten konnte ich die Eingabeaufforderung auf dem Gerät nicht erhalten. Der obige Code konnte die Eingabeaufforderung erfolgreich anzeigen.
  2. Es gibt kein // nach tel: wie die meisten Antworten. Und es funktioniert gut.


0

Gehen Sie für einen Swift 3.1- und abwärtskompatiblen Ansatz folgendermaßen vor:

@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

Wenn Ihre Telefonnummer Leerzeichen enthält, entfernen Sie diese zuerst! Dann können Sie die Lösung der akzeptierten Antwort verwenden.

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

Diese Frage enthält jetzt 17 Antworten und ist über 3 Jahre alt. Warum hielten Sie es für notwendig, noch eine Antwort hinzuzufügen?
Fogmeister

1
Weil ich nicht verstanden habe, warum es nicht funktioniert, wenn eine Telefonnummer Leerzeichen enthält. Sei nicht so negativ, Herr Herr!
Catanore

Verstehe das auf jeden Fall. Fügen Sie also explizit eine neue Frage zu Leerzeichen in Zahlen hinzu und fügen Sie Ihre eigene Antwort hinzu. Es ist nichts Falsches daran, eine Frage zu stellen und selbst zu beantworten. (Obwohl ich ziemlich sicher bin, dass diese Frage als Duplikat geschlossen wird).
Fogmeister

1
Nein, es ist wichtig, den Leuten hier zu sagen, warum die URL nicht geöffnet ist: weil sie gleich Null ist, weil die Telefonnummer Leerzeichen enthält. Ich stimme zu, dass dies eher ein Kommentar als eine Antwort sein sollte. Aber da gibt es zu viele Kommentare.
Catanore

Hat Ihnen die Erwähnung von Leerzeichen geholfen?
Catanore
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.