标签: wkurlschemehandler

如何拦截 WKWebView 请求以检测哪些本地资源文件(css、js、png 等)与 HTML 文件一起加载?

我有一个 HTML 文件,其中包含本地资源文件,例如其内容中的 css、js 和 png 文件。这些本地资源文件采用 zip 格式。我的应用程序使用 WKWebView 来显示这个 html 文件。我想找到一个解决方案来拦截 web 视图请求,以检测哪些本地资源文件与此 html 文件一起加载 -> 如果它们仍然是 zip 格式,则将它们解压缩。

我的 HTML 数据内容包含数千个这样的本地资源文件,因此在显示内容之前我无法解压缩所有这些文件。使用 UIWebView,我们使用 NSURLProtocol 子类拦截请求,检测本地资源文件并根据用户正在查看的 html 页面按需解压缩。

将 UIWebView 转换为 WKWebView 时遇到此问题。类似的问题在这里发布:https : //forums.developer.apple.com/thread/87474

======== 更新 ========>

我通过使用WKURLSchemeHandler 弄清楚了

注意:您需要将文件方案更改为自定义方案才能使用 WKURLSchemeHandler,因为它不适用于文件、http、https 等标准方案。

1. 向 WKWebView 注册自定义方案

    let configuration = WKWebViewConfiguration()
    configuration.setURLSchemeHandler(self, forURLScheme: "x-file")
    webView = WKWebView(frame: view.bounds, configuration: configuration)
Run Code Online (Sandbox Code Playgroud)

2. 将文件方案转换为自定义方案(x-file),然后使用 WKWebView 加载它

    let htmlPath = Bundle.main.path(forResource: "index", ofType: "html")
    var htmlURL = URL(fileURLWithPath: htmlPath!, …
Run Code Online (Sandbox Code Playgroud)

javascript css nsurlprotocol wkwebview wkurlschemehandler

7
推荐指数
2
解决办法
3760
查看次数

如何启用 WKURLSchemeHandler 在主线程之外执行工作?

我正在尝试让 WKURLSchemeHandler 在 WebView 使用自定义 url 方案时提供视频文件。我意识到didReceive(data)可以多次调用它,因此我已经弄清楚如何分块加载视频文件并将其发回。

问题是所有这些工作都是在主线程上完成的。我找不到如何在后台线程上成功完成此操作的示例。我可以找到的所有 WKURLSchemeHandler 示例,包括此处的WWDC 演示视频(靠近视频结尾)都非常基础。它们都没有展示如何处理大文件,更不用说如何将工作推离主线程了。

如果我只是将所有内容包装在 a 中,DispatchQueue.global(qos: .background).async {...}那么我的应用程序就会崩溃 b/c WebView 会抛出一个非托管异常并出现错误this task has already been stopped

有人知道如何成功地做到这一点吗?

wkwebview wkurlschemehandler

2
推荐指数
1
解决办法
2442
查看次数