【问题标题】:How can I tap a phone number with WKWebView如何使用 WKWebView 点击电话号码
【发布时间】:2018-07-21 21:07:25
【问题描述】:

斯威夫特 4 iOS 11.4

我正在尝试学习如何使用 WKWebView,但我遇到了一个问题,即任何电话号码链接实际上都不会显示弹出窗口来拨打该号码。

我关注了this 的回答,打印的错误如下所示。我正在使用的网站是一个使用 quickactionbar 的 wix 网站(我知道它使用 tel:xxxxx 所以它应该可以工作,因为它可以在 safari 上工作)知道为什么要这样做吗?

编辑: 另外,我不完全确定要搜索什么才能获得所需的答案。如果您确切地知道要搜索什么来找到答案,我也会对此感到非常高兴。

如果我长按它会识别这是一个电话号码,但如果我只是点击它就不会做任何事情

import Foundation
import WebKit

class WebKitViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {

var webView: WKWebView!

    @IBOutlet weak var backButton: UIBarButtonItem!

    @IBAction func backButtonAction(_ sender: UIBarButtonItem) {
        if self.webView.canGoBack {
            self.webView.goBack()
        }
    }
    override func loadView() {
    let webConfiguration = WKWebViewConfiguration()
    webView = WKWebView(frame: .zero, configuration: webConfiguration)
    webView.uiDelegate = self
    webView.navigationDelegate = self
    view = webView
}

override func viewDidLoad() {
    super.viewDidLoad()
    let myURL = URL(string: "Link")
    let myRequest = URLRequest(url: myURL!)
    webView.load(myRequest)

}

//    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
//        backButton.isEnabled = webView.canGoBack
//    }


//Code from answer on StackOverflow
    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation) {
        UIApplication.shared.isNetworkActivityIndicatorVisible = true
        print("didStartProvisionalNavigation: \(navigation)")
    }

    func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation) {
        print("didReceiveServerRedirectForProvisionalNavigation: \(navigation)")
    }

    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation, withError error: Error) {
        print("didFailProvisionalNavigation: \(navigation), error: \(error)")
    }

    func webView(_ webView: WKWebView, didFinishLoading navigation: WKNavigation) {
        UIApplication.shared.isNetworkActivityIndicatorVisible = false
        print("didFinishLoadingNavigation: \(navigation)")
    }


    func _webViewWebProcessDidCrash(_ webView: WKWebView) {
        print("WebContent process crashed; reloading")
    }

    func webView(_ webView: WKWebView,createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView?{
        //if <a> tag does not contain attribute or has _blank then navigationAction.targetFrame will return nil
        if let trgFrm = navigationAction.targetFrame {

            if(!trgFrm.isMainFrame){
                UIApplication.shared.isNetworkActivityIndicatorVisible = true
                self.webView.load(navigationAction.request)
            }
        }



        return nil
    }

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!){

        UIApplication.shared.isNetworkActivityIndicatorVisible = false
        print("didFinish: \(String(describing: self.webView.url)); stillLoading:\(self.webView.isLoading ? "NO" : "YES")")

    }



    func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (_: WKNavigationResponsePolicy) -> Void) {
        print("decidePolicyForNavigationResponse")
        decisionHandler(.allow)
    }

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (_: WKNavigationActionPolicy) -> Void) {

        decisionHandler(.allow)
    }


}

错误:

didFailProvisionalNavigation: <WKNavigation: 0x101865bd0>, error: Error Domain=NSURLErrorDomain Code=-1002 "unsupported URL" UserInfo={_WKRecoveryAttempterErrorKey=<WKReloadFrameErrorRecoveryAttempter: 0x101856b80>, NSErrorFailingURLStringKey=tel:+12199874536, NSErrorFailingURLKey=tel:+12199874536, NSLocalizedDescription=unsupported URL, NSUnderlyingError=0x1018641a0 {Error Domain=kCFErrorDomainCFNetwork Code=-1002 "(null)"}}

【问题讨论】:

  • 你是在真 iPhone 上测试吗?
  • @rmaddy 是的。如果我长按它会识别这是一个电话号码,但如果我只是点击它就不会做任何事情。

标签: ios swift wkwebview


【解决方案1】:

您还可以在 WKWebViewConfiguration 上将 dataDetectorTypes 设置为 .phoneNumber。所有检测到的电话号码都将转换为包含电话号码周围的链接。

configuration.dataDetectorTypes = .phoneNumber

使用这个 delagate 函数-

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

【讨论】:

  • 所以我可能应该对 dataDetectorTypes 做一些正确的阅读?如果文档明确声明它无需任何修改即可识别电话号码,为什么不能开箱即用?
  • developer.apple.com/documentation/webkit/wknavigationdelegate/… 这个文档没用。您知道其他任何可能对这类事情有帮助的地方吗?
  • 您可以在 www.appcoda.com 上试用
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多