Как заменить ответ WKWebView файлами внутренних ресурсов? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть WKWebView, который представляет файл HTML из файлов ресурсов проекта. Наряду с файлами ресурсов существуют файлы CSS и JavaScript для использования в веб-представлении.

Примечание: эти веб-файлы предназначены для скомпилированного веб-приложения React. CSS / JS файлы упоминаются в индексе. html файл, например, <link href="/static/css/styles.css" rel="stylesheet"> и <script src="/static/js/code.js"></script> , а также встроенный блок JavaScript, например <script> /* some code here */ </script>

Меня попросили перехватить запросы веб-представления и заменить ответ ресурсами в файлах проекта.

Я прочитал и следил за ответом Викаша на запрос перехвата с WKWebView мне удалось увидеть запросы, я получил URL-путь для файлов CSS / JS из запросов, я создал новый URLResponse, но ничто не заставило веб-представление его отображать. Приведенный ниже код взят из другого вопроса SO, который представляет собой расширение нашего ViewController до WKURLSchemeHandler. В функции start urlSchemeTask я получил URL-адрес файла, создал новый URLResponse и поместил его в методы делегата urlSchemeTask, которые ничего не сделали. (отредактировано)

Код ниже взят из другого вопроса SO, который представляет расширение нашего ViewController до WKURLSchemeHandler . В функции start urlSchemeTask я получил URL-адрес файла, создал новый URLResponse и поместил его в методы делегата urlSchemeTask, которые просто ничего не сделали.

func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {
    print("Function: \(#function), line: \(#line)")
    print("==> \(urlSchemeTask.request.url?.absoluteString ?? "")\n")
// You can find the url pattern by using urlSchemeTask.request.url. and create NSData from your local resource and send the data using 3 delegate method like done below.
// You can also call server api from this native code and return the data to the task.
// You can also cache the data coming from server and use it during offline access of this html.
// When you are returning html the the mime type should be 'text/html'. When you are trying to return Json data then we should change the mime type to 'application/json'.
// For returning json data you need to return NSHTTPURLResponse which has base classs of NSURLResponse with status code 200. 
// 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")
}

Я много искал в Интернете и не смог найти подходящего решения этой проблемы.

Жду новых решений!

...