在运行于iOS 8及更高版本的应用程序中,应使用WKWebView类来替代UIWebView。
因此,我已经将旧的UIWebView
替换为全新的WKWebView
。但我原以为这是一项简单的任务(仅需交换类并替换委托方法),结果却变成了一个真正的混乱。
问题
当我使用以下代码加载HTML字符串时:
loadHTMLString(String, baseURL: URL?)
网页视图加载并呈现纯HTML,但它不会加载任何在htmlString
内引用的图像或CSS文件。
这只会发生在真实设备上!
在模拟器中,所有引用的资源都会正确加载。
示例
我在我的视图控制器类中定义了一个简单的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
}
图片存储在根Library文件夹中,因此它的URL为:
let imageURL = libraryURL.appendingPathComponent(imageName)
现在我将htmlString
加载到Web视图中:
webView.loadHTMLString(htmlString, baseURL: libraryURL)
即使设置了baseURL
,它也无法加载图像。
解决方案的想法
也许
WKWebView
有问题解析相对路径,因此我的第一个想法是在HTML字符串中使用绝对路径。
→ ❌ 不起作用。另一个SO帖子的两个答案建议在iOS 9+中使用
loadFileURL(URL, allowingReadAccessTo: URL)
而不是loadHTMLString(...)
。
→ ✅ 可以使用该方法。
然而,我不能使用解决方案2,因为我的HTML文件是加密的,并且解密后的文件不能存储在磁盘上。
问题
是否有任何方法可以使用WKWebView
加载本地资源,如图像和样式?
loadHTMLString(String, baseURL: URL?)
这是功能问题吗?还是iOS 9+中仍然存在一个错误?
(我简直无法相信Apple提供并推荐使用的Web视图无法从HTML字符串内部加载任何本地Web内容!)