Как использовать openURL для совершения телефонного звонка в Swift?

Я преобразовал код для совершения телефонного звонка с Objective-C в Swift, но в Objective-C мы можем установить тип URL-адреса, который мы хотели бы открыть (например, телефон, SMS, сеть), например:

@"tel:xx"
@"mailto:[email protected]"
@"http://stackoverflow.com"
@"sms:768number"

Код в Swift:

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

Я прочитал, что не выписал какой-либо параметр схемы для tel:, но я не знаю, может ли Swift определить, является ли строка для совершения телефонного звонка, отправки электронной почты или открытия веб-сайта. Или я могу написать:

(string : "tel//:9809088798")

?

Ответ 1

Я уверен, что вы хотите:

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

(обратите внимание, что в тексте вопроса вы помещаете tel//:, а не tel://).

Строковый init NSURL ожидает корректный URL. Он не превратит кучу номеров в номер телефона. Иногда вы видите обнаружение номера телефона в UIWebView, но это делается на более высоком уровне, чем NSURL.

EDIT: Добавлено! за комментарий ниже

Ответ 2

Самостоятельное решение в 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") для совершения вызова.

Ответ 3

Для Swift в iOS:

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

Ответ 4

@confile:

Проблема заключается в том, что ваше решение не возвращается в приложение после телефонный звонок был завершен на iOS7. - 19 июня в 13:50

& @Zorayr

Hm, любопытно, есть ли решение, которое делает это.. может быть ограничение на iOS.

использовать

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

Появится приглашение на вызов/Отмена, но оно вернется в ваше приложение. AFAIK нет возможности вернуться (без подсказки)

Ответ 5

Вам нужно помнить об удалении пробелов или не будет работать:

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

"telprompt://" предложит пользователю позвонить или отменить, пока "tel://" вызовет напрямую.

Ответ 6

Вы должны вставить "+" \другой путь

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

Ответ 7

Небольшое обновление до Swift 3

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

Ответ 8

Следующий фрагмент кода может определить, есть ли 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  
    }

Ответ 9

Для быстрого 3

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