Как перехватить запрос WKWebView, чтобы определить, какие локальные файлы ресурсов (css, js, png, ...) загружаются вместе с файлом HTML? - PullRequest
1 голос
/ 15 октября 2019

У меня есть 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")
    }
...