1

I am using setURLSchemeHandler (with the WKURLSchemeHandler protocol) as follows:

let config = WKWebViewConfiguration()
config.setURLSchemeHandler(self, forURLScheme: "local")
WebView = WKWebView(frame: CGRect(x:0, y:0, width:self.view.frame.width, height:self.view.frame.height), configuration: config)

When I dismiss this viewcontroller, "deinit" is not called. Reason for this is using "self" in:

config.setURLSchemeHandler(self, forURLScheme: "local")

My question is, how to remove the scheme handler before dismissing the view?

Andre Harty
  • 105
  • 7
  • Did you try to call the same set, but with nil? e.g. `config.setURLSchemeHandler(nil, forURLScheme: "local")` – timbre timbre Mar 30 '22 at 13:57
  • 1
    Maybe you can try some workaround like this: https://stackoverflow.com/questions/26383031/wkwebview-causes-my-view-controller-to-leak – DefyingL Mar 30 '22 at 14:01
  • @ytrewq Yes, I did try to unset it that way, but this raises an error saying that there is already a registered URL scheme handler. – Andre Harty Mar 30 '22 at 14:02

1 Answers1

2

Based on an answer to a similar issue (thanks to @DefyingL for the tip), I now made the following solution:

class LeakAvoider : NSObject, WKURLSchemeHandler {
    
    func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {
        self.delegate?.webView(webView, start: urlSchemeTask)
    }
    
    func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {
        self.delegate?.webView(webView, stop: urlSchemeTask)
    }
    
    weak var delegate : WKURLSchemeHandler?
    init (delegate:WKURLSchemeHandler) {
        self.delegate = delegate
        super.init()
    }
    
}

And then set the scheme handler as follows:

config.setURLSchemeHandler(LeakAvoider(delegate:self), forURLScheme: "local")
Andre Harty
  • 105
  • 7