У меня есть HTML-файл, который содержит локальные файлы ресурсов, такие как CSS, JS и PNG файлы внутри своего содержимого. Эти локальные файлы ресурсов в формате zip. Мое приложение использует WKWebView для отображения этого файла HTML. Я хочу найти решение для перехвата запроса веб-просмотра, чтобы определить, какие локальные файлы ресурсов загружаются вместе с этим html-файлом -> затем распаковать их, если они все еще в формате zip.
Содержимое моих данных HTML содержит тысячиэти локальные файлы ресурсов, поэтому я не могу разархивировать их все перед отображением содержимого. С UIWebView мы используем подкласс NSURLProtocol для перехвата запроса, обнаружения локальных файлов ресурсов и разархивирования его по требованию на основе HTML-страницы, которую просматривает пользователь.
У меня возникла эта проблема при преобразовании UIWebView в WKWebView. Подобная проблема была опубликована здесь: https://forums.developer.apple.com/thread/87474
======= Обновление =======>
Я понял это с помощью WKURLSchemeHandler .
Примечание. Чтобы использовать WKURLSchemeHandler, необходимо изменить файловую схему на собственную, поскольку она не будет работать со стандартными схемами, такими как file, http, https. *. 1017 *
1. Зарегистрируйте пользовательскую схему в WKWebView
let configuration = WKWebViewConfiguration()
configuration.setURLSchemeHandler(self, forURLScheme: "x-file")
webView = WKWebView(frame: view.bounds, configuration: configuration)
2. Преобразуйте схему файла в пользовательскую схему (x-файл), затем загрузите ее с помощью WKWebView
let htmlPath = Bundle.main.path(forResource: "index", ofType: "html")
var htmlURL = URL(fileURLWithPath: htmlPath!, isDirectory: false)
htmlURL = self.changeURLScheme(newScheme: "x-file", forURL: htmlURL)
self.webView.load(URLRequest(url: htmlURL))
3. Реализовать 2 метода протокола WKURLSchemeHandler и обработать 3 метода делегирования WKURLSchemeTask.
func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {
print("Function: \(#function), line: \(#line)")
print("==> \(urlSchemeTask.request.url?.absoluteString ?? "")\n")
// Your local resource files will be catch here. You can determine it by checking the urlSchemeTask.request.url.
// From here I will unzip local resource files (js, css, png,...) if they are still in zip format
....
// Handle WKURLSchemeTask delegate methods
let url = changeURLScheme(newScheme: "file", forURL: urlSchemeTask.request.url!)
do {
let data = try Data(contentsOf: url)
urlSchemeTask.didReceive(URLResponse(url: urlSchemeTask.request.url!, mimeType: "text/html", expectedContentLength: data.count, textEncodingName: nil))
urlSchemeTask.didReceive(data)
urlSchemeTask.didFinish()
} catch {
print("Unexpected error when get data from URL: \(url)")
}
}
func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {
print("Function: \(#function), line: \(#line)")
print("==> \(urlSchemeTask.request.url?.absoluteString ?? "")\n")
}