在swift中拨打电话号码

问题描述:

我正在尝试拨打一个不使用特定号码的号码,而是拨打一个在变量中被呼叫的号码,或者至少告诉它在您的手机中拨打号码。这个在变量中被调用的数字是我通过使用解析器或从网站sql获取的数字。我做了一个按钮,试图用函数调用存储在变量中的电话号码,但无济于事。任何事情都会有帮助谢谢!在swift中拨打电话号码

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

     } 

试试看:

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

假设的电话号码是busPhone

NSURLinit(string:)返回一个可选的,所以通过使用if let我们确保urlNSURL(而不是NSURL?init返回)。


对于斯威夫特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' was deprecated in iOS 10.0

+0

这给了我一个未解决的标识符'url'错误 - 指向.openURL(url)感谢您的帮助! – Tom 2014-12-02 22:22:05

+0

nvm我错过了一封信。好吧,所以当我按下按钮什么都没有发生。这里是更多的信息---------- func parserDidEndDocument(解析器:NSXMLParser!){ println(busPhone) drawUpdatedView() } – Tom 2014-12-02 22:30:52

+0

你在手机上测试这个吗?我怀疑打开tel:// URL只能在实际的iPhone上使用,而不能在模拟器中使用,而不能在iPod或iPad上使用。 – 2014-12-03 02:49:42

好我得到的帮助和理解了它。此外,为了防止电话号码无效,我还提供了一个很好的小警报系统。我的问题是我打电话给它的权利,但数字有空格和不需要的字符,如(“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

您还应该允许我想的'+'号。 – florian 2015-05-01 17:13:58

+1

另外#是在提出请求时使用的字符之一:) – 2015-12-18 11:20:36

+0

你是上帝发送的 – 2016-04-27 04:52:44

在iOS的10自载的解决方案,斯威夫特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")拨打电话。

+0

这个工作与xcode中的模拟器吗? – Pavlos 2017-05-03 15:51:00

+0

它会给出如下错误; “该应用程序不允许查询计划电话”为SWIFT 3,这些工作是否在模拟器上? – 2017-08-08 07:00:17

+0

该代码在模拟器中不起作用。如果你想检查它使用一个设备。 – Ramakrishna 2017-08-28 08:57:36

这是@Tom的回答使用Swift 2.0的更新 注意 - 这是我使用的整个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 
} 
} 

我在我的应用程序中使用这种方法,它工作正常。我希望这可以帮助你。

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

夫特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) 
+0

它也删除'+'和'#'字符 – 2017-11-07 13:49:39

在夫特3,

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

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

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

显然这会让你的应用程序[拒绝](https://stackoverflow.com/questions/29477108/replacing-tel-or-telprompt-to-call) – 2017-08-14 10:25:06

的OpenURL()已在IOS 10.这里被弃用是新的语法:

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

其不贬值。语法的改变是因为你使用的是swift 3. – Hammadzafar 2016-11-15 07:42:54

+0

@Hammadzafar,openURl(url)方法真的被弃用了。它的新版本有不同的签名,并且已经重新命名为打开(url:options:completionHandler) – mimic 2016-12-15 17:50:45

+0

这是因为swift 2.3很快就会被折旧 – Hammadzafar 2016-12-19 06:31:46

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

这里的减少的另一种方式使用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 

我使用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.0 &的iOS 10+

UIApplication.shared.openURL(url) 改为 UIApplication.shared.open(_ url: URL, options:[:], completionHandler completion: nil)

选项完成处理是可选的,呈现:

UIApplication.shared.open(url)

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

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

对于夫特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) 
    } 
} 

的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.") 
}