【问题标题】:How to make phone calls in swift如何快速拨打电话
【发布时间】:2019-09-13 03:57:41
【问题描述】:

首先,我知道有一些与此类似的主题,但由于我的声誉,我无法对那些寻求帮助的主题发表评论,堆栈溢出警告我不要从答案部分寻求帮助.. 没有类似的帖子已经回答了我的问题,所以我开始了。

从主题可以理解,我想在点击时拨打电话, 我正在为我的企业制作一个应用程序,我想添加一个通话按钮,以便人们可以通过该应用程序给我打电话。

以下是我从类似主题中尝试过的尝试:

    let phoneNumber = "1234567890"

    if let phoneCallURL = NSURL(string: "tel:\(phoneNumber)") {
        let application = UIApplication.sharedApplication()
        if application.canOpenURL(phoneCallURL) {
            application.openURL(phoneCallURL)
        }
        else{
            println("failed")
        }
    }

所以当我使用电话号码运行上述代码时,它会在控制台上打印出失败的消息,好像我无法打开 URL

我尝试过的其他代码非常相似

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

另一个问题是:NSURL 的正确语法是什么?

这个

NSURL(string: "tel://\(phoneNumber)") 

或者这个

NSURL(string: "tel//:\(phoneNumber)")

我的最后一个问题是:如果应用程序成功拨打电话,它是否像通话屏幕一样出现在模拟器上?我对快速编程很陌生,如果这些问题看起来很愚蠢,我深表歉意..

【问题讨论】:

    标签: swift


    【解决方案1】:

    tel: URL 的简单格式是tel:######/ 不是数字。您可能的意思是:

    NSURL(string: "tel:\(phoneNumber)") 
    

    假设phoneNumber 是一个包含电话号码的字符串。

    tel: 方案在RFC2806 中定义。您可以在此处查看有关其所有预期功能的详细信息。

    请注意,模拟器中无法拨打电话,因此如果您尝试在那里打开tel: URL,您将收到错误消息(除非您通过注册NSURLProtocol 自己处理该URL)。

    【讨论】:

    • 当我将我的代码与 NSURL(string: "tel:(phoneNumber)") 一起使用时,什么也没有发生,所以我是否应该认为我的代码可以工作但不能在模拟器中使用?
    • 我不会这么认为;您需要在设备上进行测试。但这就是您可能会看到的症状(尤其是因为您没有检查 openURL 是否成功)。
    • 为了测试它,我必须将它上传到商店对吗?还有其他可以合法分享的方式吗?
    • 您不必上传到商店。只需在您的设备上运行它。你可以从 Xcode 中做到这一点。
    • @RobNapier 在设备上运行应用程序是不允许的,我试图运行它警告我有一个开发者帐户
    【解决方案2】:

    如果您想在通话结束后返回您的应用程序(您应该这样做),那么您需要使用 telprompt:// 而不是 tel://。通话结束后,tel:// 将带您进入主屏幕。

    最好用这个:

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

    【讨论】:

      【解决方案3】:
      let phoneNumber = "0507712323"
      if let callNumber = phoneNumber {
      
      let aURL = NSURL(string: "telprompt://\(callNumber)")
          if UIApplication.sharedApplication().canOpenURL(aURL) {
              UIApplication.sharedApplication().openURL(aURL)
          } else {
              print("error")
          }
       }
      else {
         print("error")}
      

      【讨论】:

      • 不鼓励使用纯代码的答案。您应该展开并描述如何解决该问题。
      【解决方案4】:

      我有这个问题有不同的原因,我想和你分享。

      首先不要在模拟器上试,必须在真机上试

      第二确保传递的数字不包含空格

      这里是例子

      private func callNumber(phoneNumber:String) {
              // I add this line to make sure passed number wihthout space 
              let CleanphoneNumber = phoneNumber.stringByReplacingOccurrencesOfString(" ", withString: "")
              if let phoneCallURL:NSURL = NSURL(string: "tel://\(CleanphoneNumber)") {
                  let application:UIApplication = UIApplication.sharedApplication()
                  if (application.canOpenURL(phoneCallURL)) {
                      application.openURL(phoneCallURL);
                  }
              }
          }
      

      【讨论】:

        【解决方案5】:

        您的代码看起来是正确的。如果您在模拟器中测试它似乎总是会失败。 尝试使用你的iPhone运行它,它会进入你想要的拨号界面。

        【讨论】:

          【解决方案6】:

          我在代码中添加了一些额外的验证

          func makeCall(constactNumber : NSString)
          {
              if(constactNumber.length == 0)
              {
                  print("Contact number in not valid")
              }
              else
              {
                  let CleanconstactNumber = constactNumber.stringByReplacingOccurrencesOfString(" ", withString: "")
                  if let phoneCallURL:NSURL = NSURL(string: "tel://\(CleanconstactNumber)")
                  {
                      if (UIDevice.currentDevice().model.rangeOfString("iPad") != nil)
                      {
                          print("Your device doesn't support this feature.")
          
                      } else
                      {
                          let application:UIApplication = UIApplication.sharedApplication()
                          if (application.canOpenURL(phoneCallURL))
                          {
                              let mobileNetworkCode = CTTelephonyNetworkInfo().subscriberCellularProvider?.mobileNetworkCode
                              if( mobileNetworkCode == nil)
                              {
                                  print(" No sim present Or No cellular coverage or phone is on airplane mode.")
                              }
                              else
                              {
                                  application.openURL(phoneCallURL);
                              }
                          }
                      }
                  }
              }
          }
          

          【讨论】:

          • 使用 'guard' 清理所有这些验证 'ifs'。
          猜你喜欢
          • 2015-01-31
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          • 2014-12-20
          • 2017-12-21
          • 1970-01-01
          相关资源
          最近更新 更多