Don't allow Webview to open hyperlinks correctly

275 views Asked by At

For example, I write as follows, then it works correctly, that is, the content that comes is displayed as it should and when the user clicks the link, it doesn't redirect anywhere.

extension AuthorizationContentView: WKNavigationDelegate {
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if navigationAction.navigationType == .linkActivated {
            decisionHandler(.cancel)
        } else {
            decisionHandler(.allow)
        }
    }
}

BUT I need to cover all the cases of clicking on the link and not just linkActivated(A link with an href attribute was activated by the user), but if I write just decisionHandler(.cancel), then the content is not displayed and it is unclear why so.

extension AuthorizationContentView: WKNavigationDelegate {
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        decisionHandler(.cancel)
        return
    }
}

UPD:

func setupWebView(content: String) {
    let supportDarkCSS = "<style>:root { color-scheme: light dark; }</style>"

    contentStackView.removeAllArrangedSubviews()
    webView.loadHTMLString(content + supportDarkCSS, baseURL: nil)
    contentStackView.addArrangedSubview(webView)
}
1

There are 1 answers

0
CloudBalancing On

Ok, so after I understand what you are trying to do, the .linkActivated navigation type does not include all of the cases you are trying to block.

I think the best options is to keep intercept the requests using the func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) delegate function.

You can use the URLRequest property on the WKNavigationActioni.e navigationAction.request.

Then you can use the URLRequest metadata, for example, the URL itself (navigationAction.request.url) or the HTTP method, and understand if that request needs to be blocked.