Звонки из приложения

ios
swift

#1

Добрый день! Возникла потребность в вызове из приложения. В табличке в одной из ячейки содержится номер, как сделать по нажатию на ячейку набор этого номера? Посоветуйте может где посмотреть.


#2

Нашел ответ!
func makeAPhoneCall() {
let url: NSURL = URL(string: “TEL://1234567890”)! as NSURL
UIApplication.shared.open(url as URL, options: [:], completionHandler: nil)
}


#3

тогда другой вопрос, в таблице получается по нажатию на 5,6 и 9 строку должен быть вызов, но в функцию должен заносится номер из этой строки
как сделать?

   func registerCell() {
        let nib = UINib(nibName: cellId, bundle: nil)
        tableView.register(nib, forCellReuseIdentifier: cellId)
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return Order.OrderTitle.allCases.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? OrderDetailCell else {
            fatalError()
        }
        cell.backgroundColor = .clear
        let orderTitle = Order.OrderTitle(rawValue: indexPath.row)!
        let field = order.configureField(by: orderTitle)
        cell.fill(with: field)
        
        return cell
    }

#4

Можно делать вызов при нажатии на любую ячейку, но в самом методе проверять, может ли приложение открыть сформированный URL. Если может, значит там номер телефона.
Только это сработает в случае, если в других ячейках нету наборов цифр.


#5

я так хотел, но в других ячейках цифры есть, и получается нужно конкретно на 5, 6 и 9 ячейку осуществлять вызов


#6

У вас в вашей модели есть хоть какое-либо свойство, по которому можно определить что это номер телефона? Кроме самого номера

Либо, если вы на 100% уверены, что эти ячейки 5,6,9 будут всегда на своих местах, то можно просто проверку по индексу делать.


#7

они всегда будут на своих местах


#8

Главное фильтровать ненужные символы: так, например, из телефонной книги вставляется со всякими тире и скобками, а вызов идёт только по цифрам. Я использую вот такое расширение к стрингу:

extension String {
    enum RegularExpressions: String {
        case phone = "^\\s*(?:\\+?(\\d{1,3}))?([-. (]*(\\d{3})[-. )]*)?((\\d{3})[-. ]*(\\d{2,4})(?:[-.x ]*(\\d+))?)\\s*$"
    }
    func isValid(regex: RegularExpressions) -> Bool {
        return isValid(regex: regex.rawValue)
    }
    func isValid(regex: String) -> Bool {
        let matches = range(of: regex, options: .regularExpression)
        return matches != nil
    }
    
    func onlyDigits() -> String {
        let filtredUnicodeScalars = unicodeScalars.filter{CharacterSet.decimalDigits.contains($0)}
        return String(String.UnicodeScalarView(filtredUnicodeScalars))
    }
    
    func makeACall() {
        if isValid(regex: .phone) {
            if let url = URL(string: "tel://\(self.onlyDigits())"), UIApplication.shared.canOpenURL(url) {
                if #available(iOS 10, *) {
                    UIApplication.shared.open(url)
                } else {
                    UIApplication.shared.openURL(url)
                }
            }
        }
    }
}

Далее по вызову makeACall будет совершаться звонок, например: yourString.makeACall()


#9

А как туда занести значение ячейки?

вот весь класс с таблицей

class OrderDetailViewController: UIViewController, UITableViewDataSource {
    
    @IBOutlet weak var tableView: UITableView!
    
    var order: Order!
    
    let cellId = "OrderDetailCell"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupTableView()
    }
    
    @IBAction func startProcessingOrder(_ sender: UIButton) {
        performSegue(withIdentifier: "goToProcessingOrder", sender: nil)
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? ChooseProcessingParamsViewController {
            vc.order = self.order
        }
    }
    
    func setupTableView() {
        tableView.dataSource = self
        registerCell()
    }
    
    func registerCell() {
        let nib = UINib(nibName: cellId, bundle: nil)
        tableView.register(nib, forCellReuseIdentifier: cellId)
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return Order.OrderTitle.allCases.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? OrderDetailCell else {
            fatalError()
        }
        cell.backgroundColor = .clear
        let orderTitle = Order.OrderTitle(rawValue: indexPath.row)!
        let field = order.configureField(by: orderTitle)
        cell.fill(with: field)
        
        return cell
    }
    
    
}

#10

Тут никуда! Это расширение типа String. Вы сами должны в своей логике по тапу на нужный объект получить String с номером и потом к нему применить метод и всё. Я вам лишь подсказал как обработать стринг, чтобы убрать лишние символы, при наличии которых, UIApplication.shared.open(URL(string: "tel://...")) провалится и всё упадёт.