WKWebView 无法使用 loadHTMLString(_, baseURL:) 加载图像和 CSS

新手上路,请多包涵

苹果的建议

在 iOS 8 及更高版本中运行的应用程序中,使用 WKWebView 类而不是使用 UIWebView。

因此,我用闪亮的新 WKWebView 替换了我的旧 UIWebView 。但我认为是一个简单的练习(简单地交换类并替换委托方法)结果却是一团糟。

问题

当我使用加载 HTML 字符串时

loadHTMLString(String, baseURL: URL?)

Web 视图加载并呈现纯 HTML,但 它不加载在 htmlString 中引用的任何图像或 CSS 文件

这只发生 在真实设备上

在 Simultor 中,所有引用的资源都已正确加载。

模拟器真实设备

例子

我在视图控制器类中定义了一个简单的 htmlString

 let imageName = "image.png"

let libraryURL: URL // The default Library URL

var htmlString: String {
    return "<html> ... <img src=\"\(imageName)\" /> ... </html>"
    // "..." represents more valid HTML code incl. header and body tags
}

该图像存储在根库文件夹中,因此其 URL 为:

 let imageURL = libraryURL.appendingPathComponent(imageName)

现在我将 htmlString 加载到 web 视图中:

 webView.loadHTMLString(htmlString, baseURL: libraryURL)

即使 baseURL 设置正确,它也不会加载图像。

解决方案的想法

  1. 也许 WKWebView 在解析相对路径时有问题,所以我的第一个想法是在 HTML 字符串中使用 绝对路径

    → ❌ 不起作用。

  2. 另一个SO帖子的 两个答案建议使用

loadFileURL(URL, allowingReadAccessTo: URL)

而不是 loadHTMLString(...) 适用于 iOS 9+。

→ ✅ 行得通。

但是,我不能使用解决方案 2,因为我的 HTML 文件是加密的,并且解密后的文件不能存储在磁盘上。

问题

有没有办法使用 WKWebView 加载本地资源,如图像和样式

loadHTMLString(String, baseURL: URL?)

功能?或者仍然是 iOS 9+ 中的错误?

(我简直不敢相信 Apple 提供并建议使用无法从 HTML 字符串中加载任何本地 Web 内容的 Web 视图?!)

原文由 Mischa 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
1 个回答

我花了一段时间才弄清楚这一点,但基于这个答案,我得到了它的工作:

https://stackoverflow.com/a/73519282/5868066

尝试这个:

 let htmlPath = URL(fileURLWithPath: "")
let htmlDirectory = htmlPath.deletingLastPathComponent()
let htmlString = try! String(contentsOfFile: htmlPath.path, encoding: .utf8)

let baseURL = URL(fileURLWithPath: htmlDirectory)
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[.zero]

webView.loadFileURL(htmlPath, allowingReadAccessTo: documentsDirectory)
webView.loadHTMLString(htmlString, baseURL: baseURL)

原文由 klaudas 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题