Detect when a link is clicked in a WKWebView

后端 未结 1 542
说谎
说谎 2021-02-04 07:23

How do you detect when a link was clicked in a WKWebView? I\'m looking for the equivalent of this in a UIWebView.

- (BOOL)webView:(UIWebView *)webView shouldSta         


        
相关标签:
1条回答
  • 2021-02-04 08:05

    What you can do in a WkWebView is the following:

    override func viewDidLoad() {
        super.viewDidLoad()
    
         let webView = WKWebView()
         self.view.addSubview(webView) // you need to also setup constraints here - I left out for clarity
         // Make sure you set the delegate, so you get the callback
         self.webView.navigationDelegate = self
    }
    
     // WKWebViewNavigationDelegate
     func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
         guard let url = navigationAction.request.url, let scheme = url.scheme, scheme.contains("http") else {
                // This is not HTTP link - can be a local file or a mailto
                decisionHandler(.cancel)
                return
            }
         // This is a HTTP link
         open(url: url)
         decisionHandler(.allow)
    }
    

    In this delegate method, you get the URL request that the WKWebView is trying to open. There you can check the attributes of the URLRequest and respond accordingly.

    You can even write an extension for URLRequest that handles that logic, so you can reuse it.

    extension URLRequest {
        var isHttpLink: Bool {
            return self.url?.scheme?.contains("http") ?? false
        }
    }
    

    Then you can change the long condition in the delegate method to:

     // WKWebViewNavigationDelegate
     func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
       guard navigationAction.request.isHttpLink else {
            decisionHandler(.allow)
            return
        }
       // ... handle url
    
    0 讨论(0)
提交回复
热议问题