【问题标题】:Calling a phone number in swift快速拨打电话号码
【发布时间】:2015-01-31 07:31:50
【问题描述】:

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

        }

【问题讨论】:

    标签: ios swift phone-number phone-call


    【解决方案1】:
    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)
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      斯威夫特 5

      我用过这个,效果很好。

      @IBAction func btnPhoneClick(_ sender: Any) {
              guard let url = URL(string: "telprompt://\(String(describing: self.phoneNumberLbl.text))"),
                     UIApplication.shared.canOpenURL(url) else {
                     return
                 }
                 UIApplication.shared.open(url, options: [:], completionHandler: nil)
          }
      

      【讨论】:

      • grantespo's one 的解决方案相同,只是您将正确的字符串插值替换为不正确的字符串描述。
      【解决方案3】:

      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”,您的应用将被拒绝。
      【解决方案4】:

      许多其他答案不适用于 Swift 5。以下是 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: 之后没有 //,就像大多数答案一样。而且效果很好。

      【讨论】:

      • 谢谢它的工作
      【解决方案5】:
      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)
      

      【讨论】:

      • 虽然这段代码 sn-p 可以解决问题,但包含解释确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
      【解决方案6】:

      适用于 Swift 4.2 及更高版本

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          如果您的电话号码包含空格,请先将其删除!然后就可以使用accepted answer's解决方案了。

          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 年了。为什么您觉得有必要添加另一个答案?
          • 因为我不明白为什么如果电话号码包含空格它不起作用。不要这么消极,先生!
          • 绝对明白这一点。因此,明确添加一个关于数字空格的新问题并添加您自己的答案。提出问题并自己回答并没有错。 (虽然,我很确定这个问题会作为重复而关闭)。
          • 不,在这里告诉人们为什么不打开url很重要:因为它是nil,因为电话号码包含空格。我同意,这应该是评论而不是答案。但是那里的cmets太多了。
          • 提到空格对您有帮助吗?
          【解决方案9】:

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

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

              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 是默认参数,您可以省略它们。
              【解决方案12】:

              试试吧:

              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 还是更高版本,因为:

              'openURL' 在 iOS 10.0 中已弃用

              【讨论】:

              • 这给了我一个未解析标识符“url”的错误 - 指向 .openURL(url) 顺便感谢您的帮助!
              • nvm 我只丢失了一封信。好的,所以当我按下按钮时,什么也没有发生。这里有更多信息 ---------- func parserDidEndDocument(parser: NSXMLParser!){ println(busPhone) drawUpdatedView() }
              • 你是在手机上测试这个吗?我怀疑打开一个 tel:// URL 只能在实际的 iPhone 上工作,而不是在模拟器中,也不能在 iPod 或 iPad 上。
              • 是的,我在 iphone 4s 上测试它,按钮点击,但它没有从我手机上的 sql 服务器中提取 busPhone 呼叫的号码。当我使用带有电话号码的 tel:// 时,它会拨打它。
              • 好的,我想我知道问题出在哪里,但不知道如何解决。从 URL 中提取的数字完全像这样 123 456-7890 而不是像这样 1234567890。如何翻译 tel:// 以读取它可以识别的形式的 URL?
              【解决方案13】:

              我正在使用带有数字验证功能的 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)")!)
                  }
              

              【讨论】:

                【解决方案14】:

                Swift 3.0 和 iOS 10+

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

                optionscompletion handler 是可选的,渲染:

                UIApplication.shared.open(url)

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

                【讨论】:

                  【解决方案15】:

                  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的“这个应用程序不允许查询方案电话”,这些是否在模拟器上工作?
                  • 该代码在模拟器中不起作用。如果你想检查它使用设备。
                  【解决方案16】:

                  这是使用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
                  

                  【讨论】:

                    【解决方案17】:

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

                    【讨论】:

                      【解决方案18】:

                      在 Swift 3 中,

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

                      【讨论】:

                        【解决方案19】:

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

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

                        【讨论】:

                        • 它没有贬值。语法的变化是因为你使用的是 swift 3。
                        • @Hammadzafar,openURl(url) 方法确实被弃用了。它的新版本有不同的签名,也被重命名为 open(url:options:completionHandler)
                        • 那是因为 swift 2.3 很快就要被贬值了
                        【解决方案20】:

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

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

                        【讨论】:

                        • 显然这会得到你的应用rejected
                        【解决方案21】:

                        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)
                        

                        【讨论】:

                        • 它还删除了 '+' 和 '#' 字符
                        【解决方案22】:

                        这是对@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
                         }
                        }
                        

                        【讨论】:

                          【解决方案23】:

                          我在我的应用程序中使用了这种方法,它运行良好。我希望这对你也有帮助。

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

                          【讨论】:

                            【解决方案24】:

                            好的,我得到了帮助并想通了。我还安装了一个不错的小警报系统,以防电话号码无效。我的问题是我说得对,但该号码有空格和不需要的字符,例如(“123 456-7890”)。 UIApplication 仅在您的号码为(“1234567890”)时才有效或接受。因此,您基本上可以通过创建一个新变量来仅提取数字来删除空格和无效字符。然后使用 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()
                                    }
                                    }
                            

                            【讨论】:

                            • 我认为您还应该允许“+”号。
                            • 也 # 是发出请求时使用的字符之一 :)
                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 2018-03-09
                            • 2023-03-14
                            • 2016-08-11
                            • 1970-01-01
                            • 2016-03-26
                            • 2012-06-17
                            • 1970-01-01
                            相关资源
                            最近更新 更多