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

        }
Thomas Martinez
quelle

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

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

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

            }
        }
    }
}
Teja
quelle
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)
        }
    }
}
Gandom
quelle
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()
        }
        }
Thomas Martinez
quelle
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)
Dipen Gajjar
quelle
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)
            }
        }
  }
LuAndre
quelle
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)
}
Ayath Khan
quelle
4

In Swift 3

if let url = URL(string:"tel://\(phoneNumber)"), UIApplication.shared.canOpenURL(url) {
     UIApplication.shared.openURL(url)
}
Venk
quelle
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)")!)
    }
Emmett
quelle
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)
}
Grantespo
quelle
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
 }
}
Michael McKenna
quelle
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)
}
Torre Lasley
quelle
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)
Mazorati
quelle
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
Ashley Mills
quelle
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.")
}
Hardik Thakkar
quelle
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)
}
iHarshil
quelle
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
quelle
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.
Mahendra Liya
quelle
0

Swift 3.0 und iOS 10+

UIApplication.shared.openURL(url) wurde geändert in UIApplication.shared.open(_ url: URL, options:[:], completionHandler completion: nil)

Optionen und Vervollständigungshandler sind optional und rendern:

UIApplication.shared.open(url)

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

RLoniello
quelle
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)
   }
}
Lauren Roth
quelle
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)
    }
}
Catanore
quelle
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