WKWebView 从文档目录加载 html 在设备上不起作用

Posted

技术标签:

【中文标题】WKWebView 从文档目录加载 html 在设备上不起作用【英文标题】:WKWebView load html from document directory don't work on device 【发布时间】:2017-11-20 18:43:34 【问题描述】:

所以,我已经下载了带有 html 文件的文件夹。

folders struct

我尝试在 WKWebView 中打开它。

let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
let url = documentsUrl.appendingPathComponent("\(model.sourceFileId)/index.html") 
self.webView.loadFileURL(url, allowingReadAccessTo: url)

在模拟器上运行良好

screenshot from simulator

但不在设备上

screenshot from device

看起来只是无法打开 css 和图像文件。但为什么?我该如何解决这个问题?

【问题讨论】:

我敢打赌它与 html 中的路径有关。可能无法找到 css 和图像文件。 @Dima 你解决了吗? 【参考方案1】:

将文件复制到NSTemporaryDirectory()并打开文件URL,它就可以工作了。我用 Objective-C 风格编写了我的代码。

NSString *basePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"dirName"];
NSString *indexHtmlPath = [basePath stringByAppendingPathComponent:@"index.html"];
NSString *htmlString = [NSString stringWithContentsOfFile:indexHtmlPath encoding:NSUTF8StringEncoding error:nil];
NSURL *baseURL = [NSURL fileURLWithPath:basePath];
[self.wkWebView loadHTMLString:htmlString baseURL:baseURL];

【讨论】:

【参考方案2】:

使用临时目录保存和打开文档的 Swift 版本。

            let docData = data as NSData
            let tempDirectory = URL(fileURLWithPath: NSTemporaryDirectory())
            let tmpURL = tempDirectory.appendingPathComponent(response?.suggestedFilename ?? "fileName.pdf")
            do 
                try data.write(to: self.tmpURL! )
             catch 
                self.showError()
                return
            
            if FileManager.default.fileExists(atPath: self.tmpURL!.path)
                DispatchQueue.main.async 
                    self.webView.loadFileURL(self.tmpURL!, allowingReadAccessTo: self.tmpURL!)
                
            
            else
                self.showError()
            

【讨论】:

以上是关于WKWebView 从文档目录加载 html 在设备上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

WKWebView 确实从本地文档文件夹加载资源

如何使用 WKWebview 从 iPad 的 Document 目录加载 javascript 和 css 资源?

iOS:WKWebview 如何允许位于 bundle 中的 html 文件对文档目录进行读取访问

WKWebView 无法在 HTML 中加载本地资源

从 HTML 字符串 wkwebview 加载脚本

从 HTML 将图像加载到 UITextview/WKWebView