迅速に電話をかける


89

特定の番号を使用せずに、変数で呼び出されている番号に電話をかけようとしています。または、少なくとも電話の番号をプルアップするように指示しています。変数で呼び出されているこの番号は、パーサーを使用するか、WebサイトのSQLから取得して取得した番号です。関数を使って変数に保存されている電話番号に電話をかけようとするボタンを作成しましたが、役に立ちませんでした。何でも感謝に役立ちます!

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

        }

回答:


191

ちょうど試して:

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

電話番号がにあると仮定しbusPhoneます。

NSURLinit(string:)戻りオプションは、それほど使用することによってif let、我々はそれが確認してurlいるNSURL(とはNSURL?で返されますinit)。


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

iOS 10以降を使用しているかどうかを確認する必要があります。理由は、次のとおりです。

「openURL」はiOS10.0で非推奨になりました


これにより、未解決の識別子「url」のエラーが発生します-.openURL(url)を指しています。ところで、助けてくれてありがとう!
トーマスマルティネス

nvm私はただの手紙が欠けていました。さて、ボタンを押しても何も起こりません。詳細はこちら---------- func parserDidEndDocument(parser:NSXMLParser!){println(busPhone)drawUpdatedView()}
Thomas Martinez

1
これを電話でテストしていますか?tel:// URLを開くことは、実際のiPhoneでのみ機能し、シミュレーターやiPodやiPadでは機能しないと思われます。
トーマスミュラー2014

ええ、私はそれをiphone 4sでテストしていますが、ボタンがクリックされますが、私の電話のSQLサーバーからbusPhoneによって呼び出された番号をプルアップしません。電話番号でtel://を使用すると、ダイヤルします。
トーマスマルティネス

2
さて、私は問題が何であるかを知っていると思いますが、それを修正する方法がわかりません。URLから取得される番号は、123 456-7890のように正確に記述され、1234567890のようには記述されません。tel://を変換して、認識できる形式でURLを読み取るにはどうすればよいですか。
トーマスマルティネス

66

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

を使用callNumber("7178881234")して電話をかけることができるはずです。


以下のようなエラーが発生します。このアプリはswift3の「スキームtelのクエリを許可されていません」で、これらはシミュレーターで動作しますか?
Kiran jadhav 2017

1
そのコードはシミュレーターでは機能しません。確認したい場合はデバイスを使用してください。
ラマクリシュナ2017

24

スウィフト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

Swift3.0およびios10以前

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

さて、私は助けを得て、それを理解しました。また、電話番号が有効でない場合に備えて、ちょっとしたアラートシステムを導入しました。私の問題は、それを正しく呼んでいたのですが、番号にスペースと( "123 456-7890")などの不要な文字が含まれていました。UIApplicationは、番号が( "1234567890")の場合にのみ機能するか、受け入れます。したがって、基本的には、数値のみをプルする新しい変数を作成することにより、スペースと無効な文字を削除します。次に、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()
        }
        }

6
'+'記号も許可する必要があると思います。
フロリアン2015年

1
また、#はリクエストを行うときに使用される文字の1つです:)
iOSDev 2015

9

上記の答えは部分的に正しいですが、「tel://」では1つの問題しかありません。通話が終了すると、アプリではなくホーム画面に戻ります。「telprompt://」を使用すると、アプリに戻ります。

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

どうやらこれはあなたのアプリを拒否
Tom Knapen 2017

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: nilデフォルトの引数であるため、省略できます。
TimVermeulen18年

7

私は自分のアプリケーションでこのメソッドを使用していますが、正常に機能しています。これがあなたにも役立つことを願っています。

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

5

Swift 5:iOS> = 10.0

物理デバイスでのみ機能します。

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

以下の誰かが、「tel」の代わりに「telprompt」を使用すると、アプリが拒否されると言っています。
Andy Weinstein

@AndyWeinsteinええ、彼らがそれを捕まえたとしても、彼らは私のどれも拒否していません
grantespo

4

Swift 3では、

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

4

番号検証付きのSwift3ソリューションを使用しています

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

これは、Swift 2.0を使用した@Tomの回答の更新 です。-これは、私が使用しているCallComposerクラス全体です。

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()はiOS10で非推奨になりました。新しい構文は次のとおりです。

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

1
減価償却されていません。あなたはSWIFT 3.使用しているので、構文の変化がある
Hammadzafar

@ Hammadzafar、openURl(url)メソッドは実際には非推奨です。新しいバージョンの署名は異なり、名前もopen(url:options:completionHandler)に変更されました
2016

それは、swift 2.3が間もなく減価償却されるためです
Hammadzafar 2016

2

他の多くの回答はSwift5では機能しません。以下はSwift5のコード更新です。

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. ほとんどの回答で、デバイスにプロンプ​​トを表示できませんでした。上記のコードは、プロンプトを正常に表示できました。
  2. // telの後にはありませんほとんどの回答が持っているように。そしてそれはうまくいきます。

1

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)

また、「+」および「#」文字を削除します
Amr Angry

1

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

迅速な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

Swift4.2以降の場合

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
このコードスニペットは問題を解決する可能性がありますが、説明を含めると投稿の品質が向上します。あなたは将来読者のために質問に答えていることを忘れないでください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。また、説明コメントでコードを混雑させないようにしてください。これにより、コードと説明の両方が読みにくくなります。
RohanKhude19年


0

Swift 3.1および下位互換性のあるアプローチの場合は、次のようにします。

@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

電話番号にスペースが含まれている場合は、最初にスペースを削除してください。次に、受け入れられた回答のソリューションを使用できます。

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

この質問には現在17の回答が含まれており、3年以上前のものです。さらに別の答えを追加する必要があると感じたのはなぜですか?
フォグマイスター2018年

1
電話番号にスペースが含まれているとなぜ機能しないのか理解できなかったからです。そんなにネガティブにならないで、ミスターマイスター!
catanore

間違いなくそれを理解してください。したがって、数字のスペースについて明示的に新しい質問を追加し、それに独自の回答を追加してください。質問をして自分で答えても問題はありません。(ただし、質問は重複として閉じられると確信しています)。
フォグマイスター2018年

1
いいえ、URLが開かれない理由をここで人々に伝えることが重要です。URLがゼロであるため、電話番号にスペースが含まれているためです。私が同意するのは、これは答えではなくコメントであるべきだということです。しかし、そこにはコメントが多すぎます。
catanore 2018年

スペースについての言及は役に立ちましたか?
catanore 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.