Швидкий дзвінок на номер телефону


89

Я намагаюся зателефонувати на номер, не використовуючи конкретні номери, а номер, який викликається у змінну, або принаймні кажу йому, щоб він витягнув номер у вашому телефоні. Це число, яке викликається у змінній, є числом, яке я отримав за допомогою аналізатора або захопивши з веб-сайту 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)!)

        }

Відповіді:


191

Просто спробуйте:

if let url = NSURL(string: "tel://\(busPhone)") where UIApplication.sharedApplication().canOpenURL(url) {
  UIApplication.sharedApplication().openURL(url)
}

припускаючи, що номер телефону в busPhone.

NSURL's init(string:)повертає Необов'язковий, тому, використовуючи, if letми переконуємось, що urlце a NSURL(а не a, 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) До речі, дякую за допомогу!
Thomas Martinez,

nvm мені не вистачало лише букви. добре, коли я натискаю кнопку, нічого не відбувається. ось докладніше ---------- func parserDidEndDocument (синтаксичний аналізатор: NSXMLParser!) {println (busPhone) drawUpdatedView ()}
Томас Мартінес

1
Ви тестуєте це на телефоні? Я підозрюю, що відкриття URL-адреси tel: // працюватиме лише на реальному iPhone, а не в тренажері та не на iPod або iPad.
Thomas Müller

Так, я тестую його на iphone 4s, коли клацне кнопка, але він не витягує номер, викликаний busPhone, із сервера SQL на моєму телефоні. Коли я використовую tel: // з номером телефону, він набирає його.
Thomas Martinez

2
Гаразд, думаю, я знаю, в чому проблема, але не знаю, як її вирішити. Номер, який витягується з URL-адреси, написаний саме так 123 456-7890, а не як 1234567890. Як перекласти tel: //, щоб прочитати URL-адресу у формі, яку він розпізнає?
Томас Мартінес

66

Автономне рішення в 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")здійснювати дзвінок.


це дасть помилку, як показано нижче; "Ця програма не може запитувати схему tel" для swift 3, і це робота на симуляторі чи ні?
Кіран джадхав

1
Цей код не буде працювати в симуляторі. Якщо ви хочете перевірити це, використовуйте пристрій.
Рамакрішна

24

Свіфт 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)

            }
        }
    }
}

13

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

9

Гаразд, я отримав допомогу і розібрався. Також я поклав гарну маленьку систему оповіщення на випадок, якщо номер телефону не дійсний. Моя проблема полягала в тому, що я називав це правильно, але в номері були пробіли та небажані символи, наприклад ("123 456-7890"). Застосування UIA працює або приймається, лише якщо ваш номер ("1234567890"). Таким чином, ви в основному видаляєте пробіл і недійсні символи, створюючи нову змінну, яка витягує лише цифри. Потім викликає ці номери за допомогою програми UIA.

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

6
Ви також повинні дозволити знак "+", я думаю.
Флоріан

1
Також # - один із символів, що використовується під час
надсилання

9

Наведені вище відповіді частково правильні, але з "tel: //" є лише одне питання. Після закінчення дзвінка він повернеться на головний екран, а не в наш додаток. Тому краще використовувати "telprompt: //", він повернеться до програми.

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

Очевидно, через це ваш додаток буде відхилено
Том Кнапен

8

Свіфт 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є аргументами за замовчуванням, їх можна опустити.
Тім Вермелен

7

Я використовую цей метод у своєму додатку, і він працює нормально. Сподіваюся, це може допомогти і вам.

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

6

Свіфт 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", ваш додаток буде відхилено.
Енді Вайнштейн,

@AndyWeinstein, може, якщо вони зловлять, але вони не відхилили жодного мого
grantespo

4

У Swift 3,

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

4

Я використовую швидке рішення 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)")!)
    }

3

Це оновлення відповіді @ 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
 }
}

2

openURL () застарілий у iOS 10. Ось новий синтаксис:

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

1
його не знецінено. зміна синтаксису пов’язана з тим, що ви використовуєте швидкий 3.
Хаммадзафар

@Hammadzafar, метод openURl (url) справді застарів. Нова версія його має інший підпис, а також була перейменована на відкриту (url: options: completeHandler)
імітувати

це тому, що швидкий 2.3 скоро буде знецінений
Хаммадзафар

2

Багато інших відповідей не працюють для 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. Немає // після тел: як і більшість відповідей. І це чудово працює.

1

Рішення 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)

він також видаляє символи "+" та "#"
Amr Angry

1

Ось альтернативний спосіб зменшити номер телефону до дійсних компонентів за допомогою 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

1

Для швидкої 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.")
}

1

Для Swift 4.2 і вище

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

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

2
Незважаючи на те, що цей фрагмент коду може вирішити питання, включення пояснення дійсно допомагає поліпшити якість вашої публікації. Пам’ятайте, що ви будете відповідати на запитання для читачів у майбутньому, і ці люди можуть не знати причин вашої пропозиції коду. Будь ласка, також намагайтеся не переповнювати свій код пояснювальними коментарями, це зменшує читабельність як коду, так і пояснень!
Рохан Худе,


0

Для підходу 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)
   }
}

0

Якщо ваш номер телефону містить пробіли, спочатку видаліть їх! Тоді ви можете використовувати рішення прийнятої відповіді .

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 років. Чому ви вважали за необхідне додати ще одну відповідь?
Фогмайстер

1
Тому що я не розумів, чому це не працює, якщо номер телефону містить пробіл. Не будьте настільки негативними, містер майстер!
катаноре

Безумовно це зрозумійте. Тож явно додайте нове запитання про пробіли в цифрах і додайте на нього власну відповідь. Немає нічого поганого в тому, щоб задати питання і відповісти на нього самостійно. (Хоча, я майже впевнений, що питання буде закрите як дублікат).
Фогмайстер

1
Ні, важливо сказати людям тут, чому URL-адресу не відкрито: тому що це нуль, оскільки номер телефону містить пробіли. Я погоджуюсь, що це скоріше коментар, ніж відповідь. Але там занадто багато коментарів.
катаноре

Чи допомогла вам згадка про пробіли?
катаноре
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.