Быстрый звонок по номеру телефона


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это 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 (парсер: NSXMLParser!) {println (busPhone) drawUpdatedView ()}
Thomas Martinez

1
Вы тестируете это на телефоне? Я подозреваю, что открытие URL-адреса tel: // будет работать только на реальном iPhone, но не в симуляторе и не на iPod или iPad.
Томас Мюллер

Да, я тестирую его на iphone 4s, кнопка нажимается, но он не подтягивает номер, вызываемый busPhone, с сервера sql на моем телефоне. Когда я использую tel: // с номером телефона, он набирает его.
Томас Мартинес

2
Хорошо, думаю, я знаю, в чем проблема, но не знаю, как ее исправить. Номер, извлекаемый из URL-адреса, в точности записывается следующим образом: 123 456-7890, а не как 1234567890. Как мне перевести tel: //, чтобы прочитать URL-адрес в той форме, которую он распознает?
Thomas Martinez

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")для звонка.


это даст ошибку, как показано ниже; «Этому приложению не разрешено запрашивать схему тел.» Для swift 3, и работают ли они на симуляторе или нет?
Kiran jadhav

1
Этот код не будет работать в симуляторе. Если вы хотите проверить это, используйте устройство.
Рамакришна

24

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)

            }
        }
    }
}

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

6
Я думаю, вы также должны разрешить знак «+».
Флориан

1
Также # - это один из символов, используемых при
отправке

9

Приведенные выше ответы частично верны, но с "tel: //" есть только одна проблема. После завершения вызова он вернется на главный экран, а не в наше приложение. Так что лучше использовать "telprompt: //", он вернется в приложение.

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

По-видимому, это приведет к отклонению
Том Кнапен,

8

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являются аргументами по умолчанию, их можно опустить.
Тим Вермёлен

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

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, ваше приложение будет отклонено.
Энди Вайнштейн

@AndyWeinstein: да, может, они поймают это, но они не отвергли ни одного из моих
grantespo

4

В Swift 3

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

4

Я использую решение 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)")!)
    }

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
его не обесцениваются. изменение синтаксиса связано с тем, что вы используете
Swift

@Hammadzafar, метод openURl (url) действительно устарел. Новая версия имеет другую подпись, а также была переименована в open (url: options: completingHandler)
имитирует

это потому, что Swift 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. После tel: // нет, как и в большинстве ответов. И работает нормально.

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

Для 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.")
}

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 лет. Почему вы посчитали необходимым добавить еще один ответ?
Fogmeister

1
Потому что я не понимал, почему не работает, если в номере телефона есть пробелы. Не ведите себя так отрицательно, мистер Майстер!
catanore

Определенно понимаю это. Так что добавьте новый вопрос о пробелах в числах и добавьте на него свой ответ. Нет ничего плохого в том, чтобы задать вопрос и ответить на него самостоятельно. (Хотя я почти уверен, что этот вопрос будет закрыт как дубликат).
Fogmeister

1
Нет, здесь важно сообщить людям, почему URL-адрес не открывается: потому что он равен нулю, потому что номер телефона содержит пробелы. С чем я согласен, это должен быть скорее комментарий, чем ответ. Но там слишком много комментариев.
Catanore

Помогло ли вам упоминание пробелов?
Catanore 06
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.