У меня есть приложение для iOS, в котором есть веб-просмотр (с использованием WebKit), в котором есть некоторая контактная информация, включая номер телефона. В приложении я хочу, чтобы мой пользователь мог щелкнуть тег привязки, и приложение спросило бы клиента, хочет ли он позвонить по этому номеру или нет. Я написал в своем html в голове следующее.

<meta name="format-detection" content="telephone=yes">

Я также безуспешно пробовал все следующие структуры якорей.

<a href="tel:+x-xxx-xxx-xxx">+x-xxx-xxx-xxx</a>
<a href="tel:xxx-xxx-xxx">xxx-xxx-xxx</a>
<a href="tel:(xxx) xxx-xxx">(xxx) xxx-xxx</a>
<a href="tel:(xxx)-xxx-xxx">(xxx)-xxx-xxx</a>

Мне нужно щелкнуть и удерживать тег привязки, чтобы отобразить это диалоговое окно, но в Android все, что вам нужно сделать, - это просто щелкнуть без удержания. Возможно ли это в iOS, и если да, то дайте знать, как это сделать? что происходит, когда я нажимаю и удерживаю тег привязки

2
hamada147 17 Дек 2017 в 23:25

1 ответ

Лучший ответ

Хорошо, после тестирования в течение более недели, чтобы найти решение этой проблемы.
Вот решение. На самом деле не имело значения структура телефона, поскольку это имело значение для кода, который я написал для обработки того, что происходит, когда пользователь нажимает на него (из приложения внутри веб-представления).
В классе, отвечающем за это (ваш контроллер представления)

extension ViewController: WKNavigationDelegate, WKUIDelegate {
    // handle it here
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        // print(navigationAction.request.url!)
        // if the URL have tel in it then use the iOS to open it not the webkit
        if (navigationAction.request.url!.absoluteString.contains("tel")) {
            UIApplication.shared.openURL(navigationAction.request.url!)
            decisionHandler(.cancel)
        } else if (!(navigationAction.request.url!.absoluteString.contains(MAINURLNOTTOGOOUTSIDE))) {
            // if the URL is something outside of the one specified in that string "MAINURLNOTTOGOOUTSIDE", open it using the iOS not the webkit
            UIApplication.shared.openURL(navigationAction.request.url!)
            decisionHandler(.cancel)
        } else {
            decisionHandler(.allow)
        }
    }

    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
        let app = UIApplication.shared
        if (navigationAction.targetFrame == nil) {
            if (navigationAction.request.url!.scheme?.contains("tel"))! {
                if (app.canOpenURL(navigationAction.request.url!)) {
                    app.openURL(navigationAction.request.url!)
                }
            }
        }
        return nil
    }
    // handle if failed to connect to the server
    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
        var message = ""
        var title = ""
        var button = ""

        if (Locale.preferredLanguages[0].contains("ar")) {
            title = "خطأ"
            message = "تعذر الوصول الى الخادم الرجاء المحاولة في وقت لاحق"
            button = "حسنا"
        } else {
            title = "Error"
            message = "Unable to access server Please try again later"
            button = "OK!"
        }
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: button, style: .default, handler: nil))
    }
    // handle if failed to connect to the server
    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
        var message = ""
        var title = ""
        var button = ""

        if (Locale.preferredLanguages[0].contains("ar")) {
            title = "خطأ"
            message = "تعذر الوصول الى الخادم الرجاء المحاولة في وقت لاحق"
            button = "حسنا"
        } else {
            title = "Error"
            message = "Unable to access server Please try again later"
            button = "OK!"
        }
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: button, style: .default, handler: nil))
    }
}

Также не забудьте включить в метод viewDidLoad следующее

self.WebView.navigationDelegate = self
2
hamada147 26 Дек 2017 в 13:47