如何使用 openURL 在 Swift 中拨打电话?

Posted

技术标签:

【中文标题】如何使用 openURL 在 Swift 中拨打电话?【英文标题】:How to use openURL for making a phone call in Swift? 【发布时间】:2014-08-06 17:23:49 【问题描述】:

我已经将用于拨打电话的代码从 Objective-C 转换为 Swift,但是在 Objective-C 中,我们可以像这样设置我们想要打开的 URL 的类型(例如电话、短信、网络):

@"tel:xx"
@"mailto:info@example.es"
@"http://***.com"
@"sms:768number"

Swift 中的代码是:

UIApplication.sharedApplication().openURL(NSURL(string : "9809088798")

我读到没有为tel: 发布任何方案参数,但我不知道 Swift 是否可以检测到该字符串是否用于拨打电话、发送电子邮件或打开网站。或者我可以写:

(string : "tel//:9809088798")

?

【问题讨论】:

我看不出问题出在哪里。你试过了吗?它奏效了吗?请不要删除和转发问题。 我的问题是我想知道这对调用是否正确: UIApplication.sharedApplication().openURL(NSURL(string : "9809088798") 因为只有模拟器可以试一试 【参考方案1】:

要在 swift 5.1 中进行调用,只需使用以下代码:(我已在 Xcode 11 中测试过)

let phone = "1234567890"
if let callUrl = URL(string: "tel://\(phone)"), UIApplication.shared.canOpenURL(callUrl) 
     UIApplication.shared.open(callUrl)

编辑: 对于 Xcode 12.4、swift 5.3,只需使用以下代码:

UIApplication.shared.open(NSURL(string: "tel://555-123-1234")! as URL)

确保你导入了 UIKit,否则它会说它在范围内找不到 UIApplication。

【讨论】:

【参考方案2】:

Swift 4 及以上版本

let dialer = URL(string: "tel://5028493750")
    if let dialerURL = dialer 
        UIApplication.shared.open(dialerURL)

【讨论】:

【参考方案3】:

对于 Swift 4:

func call(phoneNumber: String) 
    if let url = URL(string: phoneNumber) 
        if #available(ios 10, *) 
            UIApplication.shared.open(url, options: [:],
                                      completionHandler: 
                                        (success) in
                                        print("Open \(phoneNumber): \(success)")
            )
         else 
            let success = UIApplication.shared.openURL(url)
            print("Open \(phoneNumber): \(success)")
        
    
 

然后,使用函数:

let phoneNumber = "tel://+132342424"
call(phoneNumber: phoneNumber)

【讨论】:

【参考方案4】:

对于 Swift 3

if let phoneCallURL:URL = URL(string:"tel://\(phoneNumber ?? "")") 
            let application:UIApplication = UIApplication.shared
            if (application.canOpenURL(phoneCallURL)) 
                application.open(phoneCallURL, options: [:], completionHandler: nil);
            
        

【讨论】:

【参考方案5】:

下面的代码 sn-p 可以判断 SIM 卡是否存在以及设备是否能够拨打电话,如果正常则拨打电话

  var info = CTTelephonyNetworkInfo()
    var carrier = info.subscriberCellularProvider
    if carrier != nil && carrier.mobileNetworkCode == nil || carrier.mobileNetworkCode.isEqual("") 
       //SIM is not there in the phone
    
    else if UIApplication.sharedApplication().canopenURL(NSURL(string: "tel://9809088798")!)
    
    UIApplication.sharedApplication().openURL(NSURL(string: "tel://9809088798")!)
    
    else    
    
      //Device does not have call making capability  
    

【讨论】:

【参考方案6】:

Swift 3 的小更新

UIApplication.shared.openURL(NSURL(string: "telprompt://9809088798")! as URL)

【讨论】:

【参考方案7】:

您需要记住删除空格,否则它将不起作用:

if let telephoneURL = NSURL(string: "telprompt://\(phoneNumber.stringByReplacingOccurrencesOfString(" ", withString: ""))") 
        UIApplication.sharedApplication().openURL(telelphoneURL)
    

“telprompt://”将提示用户拨打或取消,而“tel://”将直接拨打。

【讨论】:

【参考方案8】:

对于 iOS 中的 Swift:

var url:NSURL? = NSURL(string: "tel://9809088798")
UIApplication.sharedApplication().openURL(url!)

【讨论】:

这将直接开始拨打号码(当然iOS 10.3之后会要求允许拨打)但是如果我需要打开填充号码的iPhone拨号器怎么办?我能做到吗?【参考方案9】:

@配置文件:

问题是您的解决方案在 在 iOS7 上通话已完成。 – 6 月 19 日 13:50

&@佐瑞尔

嗯,好奇是否有解决方案可以做到这一点..可能是 对 iOS 的限制。

使用

UIApplication.sharedApplication().openURL(NSURL(string: "telprompt://9809088798")!)

您将收到呼叫/取消提示,但它会返回到您的应用程序。 AFAIK 没有办法返回(没有提示)

【讨论】:

【参考方案10】:

我很确定你想要:

UIApplication.sharedApplication().openURL(NSURL(string: "tel://9809088798")!)

(请注意,在您的问题文本中,您输入的是tel//:,而不是tel://)。

NSURL 的字符串 init 需要一个格式正确的 URL。它不会把一堆数字变成一个电话号码。你有时会在 UIWebView 中看到电话号码检测,但这是在比 NSURL 更高的级别上完成的。

编辑:添加!根据下面的评论

【讨论】:

只是一个小小的修正 UIApplication.sharedApplication().openURL(NSURL(string: "tel://9809088798")!) 你需要使用 !在 NSURL 之后,因为它返回一个可选的。 这将直接开始呼叫号码(当然iOS 10.3之后会要求允许呼叫)但是如果我需要打开填充号码的iPhone拨号器怎么办?我能做到吗? 真棒答案先生:)【参考方案11】:

你必须插入“+”\是另一种方式

private func callNumber(phoneNumber:String) 
  if let phoneCallURL:NSURL = NSURL(string:"tel://"+"\(phoneNumber)") 
    let application:UIApplication = UIApplication.sharedApplication()
    if (application.canOpenURL(phoneCallURL)) 
      application.openURL(phoneCallURL);
    
  

【讨论】:

【参考方案12】:

Swift 中的独立解决方案:

private func callNumber(phoneNumber:String) 
  if let phoneCallURL:NSURL = NSURL(string:"tel://\(phoneNumber)") 
    let application:UIApplication = UIApplication.sharedApplication()
    if (application.canOpenURL(phoneCallURL)) 
      application.openURL(phoneCallURL);
    
  

现在,您应该可以使用callNumber("7178881234") 拨打电话了。

【讨论】:

问题是你的解决方案在iOS7上打完电话后没有返回应用。 嗯,好奇是否有解决方案可以做到这一点.. 可能是对 iOS 的限制。

以上是关于如何使用 openURL 在 Swift 中拨打电话?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过编程拨打电话

使用 UITextField 中的号码拨打电话

如何在iOS中拨打手机号码[重复]

'openURL'在iOS 10.0中已被弃用:请使用openURL:options:completionHandler:而不是在Swift 3中[重复]

openurl 跳转

Swift - 在应用程序中打开网页,按钮没有反应