WKWebView: Completion handler passed to -[WebWidgetVC webView:decidePolicyForNavigationAction:decisionHandler:] was not called

Viewed 139

I'm using swift in my project. i have WebWidgetVC (which is UIViewController) and inside of that UIViewController i have a WKWebView. i want for example if the url contain "https" denied the WKWebView and if the url contain "http" the WKWebView allowed. this is my codes:

import UIKit
import WebKit

class WebWidgetVC: BaseViewController {

    var webView: WKWebView!
    var widgetUrl: String?
    var widget: Widget?
    private var moreInfoView: WidgetInfoView!

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .white
    
    if let wrappedUrl = widgetUrl, let url = URL(string: wrappedUrl) {
        
        let preference = WKPreferences()
        preference.javaScriptEnabled = true
        preference.javaScriptCanOpenWindowsAutomatically = false
        preference.setValue(false, forKey: "allowFileAccessFromFileURLs")
        
        let configuration = WKWebViewConfiguration()
        configuration.preferences = preference
        configuration.setValue(false, forKey: "allowUniversalAccessFromFileURLs")
        configuration.websiteDataStore = WKWebsiteDataStore.default()
        
        webView = WKWebView(frame: CGRect.zero, configuration: configuration)
        webView.uiDelegate = self
        webView.navigationDelegate = self
        webView.load(URLRequest(url: url))
        webView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(webView)
        
        NSLayoutConstraint.activate([
            webView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            webView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            webView.topAnchor.constraint(equalTo: view.topAnchor),
            webView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
        ])
        
        view.sendSubviewToBack(webView)
    }
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    if #available(iOS 13.0, *) {
       return .darkContent
    } else {
       return .default
    }
}

@IBAction func showMoreInfo(_ sender: UIButton) {
    guard let widget = widget else {
        return
    }
    
    moreInfoView = WidgetInfoView(frame: view.frame)
    view.addSubview(moreInfoView)
    
    moreInfoView.activeReceiptView(widget: widget)
}

@IBAction func dismissVC(_ sender: UIButton) {
    dismiss(animated: true, completion: nil)
}

}

// MARK: - Safari webkit delegate 
extension WebWidgetVC: WKNavigationDelegate, WKUIDelegate {

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

        let request = navigationAction.request
        let urlScheme = request.url?.scheme

        if urlScheme == "http" {
            decisionHandler(.allow)
        } else if urlScheme == "https" {
            decisionHandler(.cancel)
        }
    }
}

when program calling decisionHandler(.allow), getting this error:

Completion handler passed to -[WebWidgetVC webView:decidePolicyForNavigationAction:decisionHandler:] was not called

how can i fix this problem?

Updated

i put some breakpoints inside decidePolicyFor function and find out that after executing decisionHandler(.allow) code, this function called again.

0 Answers
Related