ios - 用于离线查看的 Swift iOS 缓存 WKWebView 内容

标签 ios swift caching offline wkwebview

我们正在尝试将 WKWebView 的内容 (HTML) 保存在持久存储(NSUserDefaults、CoreData 或磁盘文件)中。用户在没有互联网连接的情况下重新进入应用程序时可以看到相同的内容。 WKWebView 不像 UIWebView 那样使用 NSURLProtocol(参见帖子 here)。

虽然看到帖子说“WKWebView中没有启用离线应用缓存”。 (Apple 开发者论坛),我知道存在解决方案。

我知道了两种可能性,但我无法使它们起作用:

1) 如果我在 Safari for Mac 中打开一个网站并选择文件 >> 另存为,它会在下图中出现以下选项。对于 Mac 应用程序存在 [[[webView mainFrame] dataSource] webArchive],但在 UIWebView 或 WKWebView 上没有这样的 API。但是如果我在 WKWebView 上的 Xcode 中加载一个 .webarchive 文件(就像我从 Mac Safari 获得的文件),那么如果没有互联网连接,内容就会正确显示(html、外部图像、视频预览)。 .webarchive 文件实际上是一个 plist(属性列表)。我尝试使用创建 .webarchive 文件的 mac 框架,但它不完整。

enter image description here

2) 我在 webView:didFinishNavigation 中获取了 HTML,但它不保存外部图像、css、javascript

 func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {

    webView.evaluateJavaScript("document.documentElement.outerHTML.toString()",
        completionHandler: { (html: AnyObject?, error: NSError?) in
            print(html)
    })
}

我们努力了一个多星期,这是我们的主要功能。 非常感谢任何想法。

谢谢!

最佳答案

我知道我来晚了,但我最近一直在寻找一种存储网页以供离线阅读的方法,但仍然找不到任何不依赖于页面本身且不会使用的可靠解决方案已弃用的 UIWebView。许多人写道应该使用现有的 HTTP 缓存,但 WebKit 似乎在进程外做了很多事情,这使得它几乎不可能强制执行完整的缓存(参见 herehere )。但是,这个问题引导我走向了正确的方向。修改网络存档方法后,我发现编写自己的网络存档导出器实际上非常容易。

正如问题中所写,网络存档只是 plist 文件,因此它所需要的只是一个从 HTML 页面中提取所需资源的爬虫,将它们全部下载并存储在一个大的 plist 文件中。稍后可以通过 loadFileURL(URL:allowingReadAccessTo:) 将此存档文件加载到 WKWebView

我创建了一个演示应用程序,它允许使用这种方法从 WKWebView 进行归档和恢复:https://github.com/ernesto-elsaesser/OfflineWebView

编辑:存档生成代码现在可以作为独立的 Swift 包使用:https://github.com/ernesto-elsaesser/WebArchiver

实现只依赖于Fuzi用于 HTML 解析。

关于ios - 用于离线查看的 Swift iOS 缓存 WKWebView 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36246495/

相关文章:

ios - EXC_CORPSE_NOTIFY 终止原因 : Namespace SPRINGBOARD

ios - 启动屏幕 xib 无法正确显示 imageview

ios - AVAudioRecorder、AudioKit 问题、iOS 13.1.2

caching - GORM(纹理)-缓存Blob图片或其他内容

apache-flex - 防止浏览器中的 Flex 应用程序缓存(多个模块)

ios - 'UINavigationBar'的可见@interface没有声明选择器'titleTextAttributes:'

ios - 如何将 UInt32 转换为 UInt8

c - 如何访问映射到 swift 结构的内存缓冲区?

ios - Swift - 从也是 UIViewController 的通用基类继承 UIViewController

sql-server - 如何保持 Redis 数据与 SQL Server 中的数据准确