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.