快速拨打电话


89

我正在尝试拨打的电话不是使用特定号码,而是使用在变量中被调用的号码,或者至少告诉它在您的电话中提取该号码。这个在变量中被调用的数字是我通过使用解析器或从网站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)!)

        }

Answers:


191

你试一试:

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

假设电话号码在busPhone

NSURLinit(string:)返回Optional,因此使用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或更高版本上,因为:

iOS 10.0中不推荐使用'openURL'


这给了我一个无法解析的标识符'url'的错误-指向.openURL(url),谢谢您的帮助!
Thomas Martinez

NVM我只想念一封信。好的,所以当我按下按钮时,什么也没发生。这是更多信息---------- func parserDidEndDocument(parser:NSXMLParser!){println(busPhone)drawUpdatedView()}
Thomas Martinez

1
您要在手机上测试吗?我怀疑打开tel:// URL仅能在实际的iPhone上使用,而不能在模拟器中,也不能在iPod或iPad上使用。
ThomasMüller2014年

是的,我正在iphone 4s上对其进行测试,但该按钮会单击,但是它不会从我手机上的sql服务器中提取busPhone调用的号码。当我将tel://与电话号码一起使用时,它会拨打它。
Thomas Martinez

2
好吧,我想我知道问题出在哪里,但不知道如何解决。从URL中提取的数字是完全像这样写的123 456-7890,而不是这样的1234567890。我如何转换tel://以便以可以识别的形式读取URL?
Thomas Martinez 2014年

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")拨打电话。


它会给出如下错误;swift 3的“此应用程序不允许查询方案tel”,这些是否在模拟器上起作用?
Kiran jadhav

1
该代码将无法在模拟器中使用。如果要检查它,请使用设备。
罗摩克里希纳

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

Swift 3.0和ios 10或更旧版本

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”)。仅当您的电话号码是(“ 1234567890”)时,UIApplication才起作用或接受。因此,您基本上可以通过创建新变量以仅提取数字来删除空格和无效字符。然后使用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
我认为您还应该允许“ +”号。
弗洛里安

1
另外#是发出请求时使用的字符之一:)
iOSDev

9

以上答案部分正确,但是使用“ tel://”仅存在一个问题。通话结束后,它将返回主屏幕,而不是我们的应用程序。因此最好使用“ telprompt://”,它将返回到应用程序。

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

显然,这会使您的应用程序被拒绝
Tom Knapen '17

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是默认参数,您可以忽略它们。
Tim Vermeulen

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

下面的人说,如果您使用“ telprompt”而不是“ tel”,则您的应用将被拒绝。
安迪·温斯坦

@AndyWeinstein嗯,如果他们抓住了它,但他们没有拒绝我的任何一个
Grantespo

4

在Swift 3中

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

4

我正在使用带有数字验证的Swift 3解决方案

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

在iOS 10中已弃用openURL()。这是新语法:

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

1
它没有贬值。语法上的变化是因为您使用的是
swift3。– Hammadzafar

@ Hammadzafar,openURl(url)方法确实已被弃用。它的新版本具有不同的签名,并且已经重命名为open(url:options:completionHandler)
模仿

那就是因为swift 2.3即将被贬值
Hammadzafar

2

其他许多答案都不适用于Swift5。以下是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. 有了大多数答案,我无法在设备上得到提示。上面的代码已成功显示提示。
  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)

它也去掉“+”和“#”字符
阿姆鲁愤怒

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

对于Swift 4.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
尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。也请尽量不要在代码中加入解释性注释,这会降低代码和解释的可读性!
罗汉·库德


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年以上。您为什么觉得有必要再添加一个答案?
Fogmeister

1
因为我不明白如果电话号码包含空格,为什么它不起作用。先生,别那么消极!
catanore

绝对明白。因此,明确添加一个有关数字空格的新问题,并为其添加自己的答案。提出问题并亲自回答没有错。(尽管,我很确定这个问题将作为一个重复被关闭)。
Fogmeister

1
不,重要的是在这里告诉人们为什么未打开该URL:因为它为零,因为电话号码包含空格。我同意,这应该是评论而不是答案。但是那里有太多评论。
catanore

提到空格对您有帮助吗?
catanore
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.