Я думаю, это можно сделать, отменяя загрузку в методе делегата и делая ее вручную:
func webView(_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
URLSession.shared.dataTask(with: navigationAction.request) { [weak webView] (data, _, _) in
decisionHandler(.cancel)
guard let html = data.flatMap({ String(data: $0, encoding: .utf8) }) else {
return
}
webView?.loadHTMLString(html, baseURL: navigationAction.request.url)
}.resume()
}
Естественно в такой ситуации надо тщательно проработать всяческие граничные условия, к примеру редиректы.