Ios 在swift中拨打电话号码

Ios 在swift中拨打电话号码,ios,swift,phone-number,phone-call,Ios,Swift,Phone Number,Phone Call,我试着拨打一个号码,不是使用特定的号码,而是一个在变量中呼叫的号码,或者至少告诉它调出你手机中的号码。在变量中调用的这个数字是我通过使用解析器或从网站sql获取的数字。我做了一个按钮,试图调用存储在变量中的电话号码,但没有用。什么都行,谢谢 func callSellerPressed (sender: UIButton!){ //(This is calls a specific number)UIApplication.sharedApplication().openURL(NSU

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

        }
试试看:

if let url = NSURL(string: "tel://\(busPhone)") where UIApplication.sharedApplication().canOpenURL(url) {
  UIApplication.sharedApplication().openURL(url)
}
假设电话号码在
总线电话中

NSURL
init(字符串:)
返回一个可选值,因此通过使用
if let
我们确保
url
NSURL
(而不是
init
返回的
NSURL?


对于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或更高版本,因为:

iOS 10.0中不推荐使用“openURL”


好吧,我得到了帮助,并且找到了答案。我还设置了一个很好的小警报系统,以防电话号码无效。我的问题是我说得对,但是这个号码有空格和不需要的字符,比如(“123456-7890”)。UIApplication仅在您的号码为(“1234567890”)时有效或接受。因此,通过创建一个新变量来仅提取数字,基本上可以删除空格和无效字符。然后使用UIC应用程序调用这些号码

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()
        }
        }
func callSellerPressed(发件人:ui按钮!){
var newPhone=“”
对于(变量i=0;i1){
UIApplication.sharedApplication().openURL(NSURL(字符串:“tel:/”+newPhone)!)
}
否则{
let alert=UIAlertView()
alert.title=“对不起!”
alert.message=“电话号码不适用于此业务”
alert.addButtonWithTitle(“确定”)
alert.show()
}
}

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

您应该能够使用
呼叫号码(“7178881234”)
拨打电话。

这是使用Swift 2.0更新@Tom的答案 注意-这是我正在使用的整个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)
}
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)
在Swift 3中

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

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

var url:NSURL = NSURL(string: "telprompt://1234567891")!
UIApplication.sharedApplication().openURL(url)
openURL()在iOS 10中已被弃用。以下是新语法:

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

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

这里有一种替代方法,可以使用
扫描仪将电话号码缩减为有效组件

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

Swift 3.0和iOS 10+

UIApplication.shared.openURL(url)
改为
UIApplication.shared.open(url:url,选项:[:],completionHandler completion:nil)

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

UIApplication.shared.open(url)

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

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

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

如果您的电话号码包含空格,请先将其删除!然后你可以使用这个解决方案

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

            }
        }
    }
}
适用于Swift 4.2及以上版本


Swift 5:iOS>=10.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.")
}
此解决方案为零保存

仅适用于物理设备


其他许多答案对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)
    }
}
附言:

  • 有了大多数答案,我无法在设备上得到提示。上述代码已成功显示提示
  • 与大多数答案一样,电话之后没有/。而且效果很好
  • Swift 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)
        }
    

    这是给我一个未解析标识符“url”的错误-指向.openURL(url)谢谢你的帮助!我只是少了一封信。好吧,当我按下按钮时,什么也没发生。这里有更多信息------func parserDidEndDocument(parser:NSXMLParser!){println(busPhone)drawUpdatedView()}您正在电话上测试这个吗?我怀疑打开一个tel://URL只能在实际的iPhone上工作,而不能在模拟器上工作,也不能在iPod或iPad上工作。是的,我正在iPhone 4s上测试它,按钮点击,但它不能从我手机上的sql server上调出busPhone呼叫的号码。当我使用带有电话号码的电话时,它会拨。好的,我想我知道问题出在哪里,但不知道如何解决。从URL中提取的数字完全是这样写的123456-7890,而不是这样写的123456780。我该如何翻译tel://以它可以识别的形式读取URL?我认为您还应该允许使用“+”符号。另外,#是发出请求时使用的字符之一:)它不会贬值。语法上的变化是因为您使用的是swift 3。@Hammadzafar,openURl(url)方法确实不受欢迎。它的新版本有不同的签名,也被重命名为open(url:options:completionHandler),这是因为swift 2.3即将发布,编辑将给出如下错误;swift 3的“此应用程序不允许查询方案电话”,这些代码是否在模拟器上工作?该代码在模拟器中不工作。如果你想检查它,使用一个设备。显然这会让你的应用程序也删除“+”和“#”图表。这个问题现在有17个答案,已经超过3年了。你为什么觉得有必要
    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)
        }
    }
    
    @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)
        }