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

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

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

Swift 中的代码是:

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

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

(string : "tel//:9809088798")

?

【问题讨论】:

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

标签: swift nsurl xcode6 openurl


【解决方案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 的限制。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-02-25
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-09-25
                    • 1970-01-01
                    相关资源
                    最近更新 更多