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

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

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

код в Swift:

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

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

(string : "tel//:9809088798")

?

11 ответов


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

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

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

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

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


автономное решение в Свифт:

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") чтобы позвонить.


для Swift в iOS:

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

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

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

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


@ confile:

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

& @ Zorayr

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

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

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

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


вы должны вставить " + " \ is another way

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

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

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

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

для 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);
            }
        }

для 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)

тот же ответ в Swift 4.2

func dialNumber(number : String) {

 if let url = URL(string: "tel://\(number)"),
   UIApplication.shared.canOpenURL(url) {
      if #available(iOS 10, *) {
        UIApplication.shared.open(url, options: [:], completionHandler:nil)
       } else {
           UIApplication.shared.openURL(url)
       }
   } else {
            // add error message here 
   }
}

называй это как ниже

dialNumber(number: "+921111111222")