我有一个 WKWebView,它显示了项目资源文件中的 HTML 文件。除了资源文件之外,还有供 Web 视图使用的 CSS 和 JavaScript 文件。
旁注:这些 web 文件适用于已编译的 React web 应用程序。CSS / JS 文件在 index.html 文件中被引用,如 so<link href="/static/css/styles.css" rel="stylesheet">
和<script src="/static/js/code.js"></script>
,以及 JavaScript 的内联块,例如<script> /* some code here */ </script>
我被要求拦截 Web 视图的请求并将响应替换为项目文件中的资源。
我已经阅读并关注了Vikash关于Intercept request with WKWebView的回答, 我设法看到了请求,我从请求中获得了 CSS / JS 文件的 URL 路径,我创建了一个新的 URLResponse,但没有任何东西让 Web 视图显示它。下面的代码来自另一个 SO 问题,代表我们的 ViewController 到 WKURLSchemeHandler 的扩展。在启动 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")
}
我在网上搜索了很多,但找不到合适的解决方案。
期待听到更多的解决方案!