Search code examples
iosswiftwebkit

How to show call dialog when click on action tag?


[![enter image description here][1]][1] [1]: https://i.sstatic.net/7FUgg.png

I want to open a phone number Alertsheet (like + 91-1234567890) when click call button(phone icon). my image shows page of web, which is called in my app and i have use WebKit in my code.

what i have tried, i'm new to webkit help me out.

import UIKit
import WebKit
import Alamofire

class ContinueViewController: UIViewController, WKUIDelegate {

    func getPostString(params:[String:Any]) -> String{
            var data = [String]()
            for(key, value) in params
            {
                data.append(key + "=\(value)")
            }
            return data.map { String($0) }.joined(separator: "&")
    }

    @IBOutlet weak var activityView: UIActivityIndicatorView!
    @IBOutlet weak var webview: WKWebView!

    var url: URL?
    var id = 0, skill = 0
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        if #available(iOS 14.0, *) {
            webview.configuration.defaultWebpagePreferences.allowsContentJavaScript = true
        }else {
            let preferences = WKPreferences()
            preferences.javaScriptEnabled = true

            let configuration = WKWebViewConfiguration()
            configuration.websiteDataStore = WKWebsiteDataStore.nonPersistent()
            configuration.preferences = preferences
        }

        webview.navigationDelegate = self
        self.navigationController?.navigationBar.isHidden = true
        webview.uiDelegate = self

    }
    override func viewDidLoad() {
        super.viewDidLoad()
        activityView.startAnimating()
        guard let url = self.url else { return }
        var req = URLRequest(url: url)
        let params = ["id" : id,"skill" : skill]
        let postString = self.getPostString(params: params)
        req.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        req.httpMethod = "POST"
        req.httpBody = postString.data(using: .utf8)
        self.webview.load(req)
    }
}

extension ContinueViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        activityView.stopAnimating()
    }
}


Solution

  • In your WKNavigationDelegate implementation, you can do something like the following:

        func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
          if let url = navigationAction.request.url, url.scheme == "tel" {
            UIApplication.shared.open(url)
            decisionHandler(.cancel)
          }else {
            decisionHandler(.allow)
          }
        }