WKWebView默认缓存的使用

WKWebView加载网页时为了追求更好的用户体验,会设计一个缓存机制来应对加载缓慢的问题。
缓存的方案一般有2种:
1.利用浏览器自带的缓存机制。优点(缓存机制由系统提供方便快捷),缺点(系统将内容存在cache中,在遇到内存紧张的时候会自动清理一次)
2.将网页内容以压缩包的形式下载到Document下面,解压后进行加载。优点(Document下的资源不会被无故清除),缺点(需要自行设计一整套更新替换方案,iOS9以下的需要把内容copy到temp目录才能读取)
这里就第1种利用系统的缓存方案进行了尝试。

系统的请求方法

let url = URL.init(string: "http://localhost/htmlMoudle/index")!let request = URLRequest.init(url: url, cachePolicy: .reloadRevalidatingCacheData, timeoutInterval: 15.0)self.webView?.load(request)

这其中的cachePolicay是一个枚举,具体的含义如下

case useProtocolCachePolicy//默认方式case reloadIgnoringLocalCacheData//不使用缓存case reloadIgnoringLocalAndRemoteCacheData//决不使用任何缓存case returnCacheDataElseLoad//使用缓存(不管它是否过期),如果缓存中没有,那从网络加载吧case returnCacheDataDontLoad//离线模式:使用缓存(不管它是否过期),但是不从网络加载case reloadRevalidatingCacheData//验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据

根据枚举的描述,普遍的需求貌似只需要最后那种方式reloadRevalidatingCacheData来进行请求就能达到正常的更新和缓存使用的要求了。

reloadRevalidatingCacheData缓存策略的验证

一、准备工作

1.(Mac电脑)将准备好的工程放到:/资源库/WebServer/Documents下,如图所示

屏幕快照 2018-09-29 11.26.32.png


2.打开终端,开启mac电脑的apache服务器:
开启apache: sudo apachectl start
重启apache: sudo apachectl restart
关闭apache: sudo apachectl stop


二、修改前的运行结果

修改前的截图.png

三、修改后的运行结果

修改后的截图.png

测试说明reloadRevalidatingCacheData确实是有效的,有个问题就是如果在这个网页之内请求的其它的网页,这个新点开的网页的缓存策略就会换成了默认的缓存策略了。

清除缓存

系统会在cache内存警告的时候自行清理缓存一次,手动清除缓存代码如下(根据具体情况使用)

/**支持iOS9.0以上的清理方法*//**dataTypes传一个集合,可以指定只删除内存或是Disk或是cookie的内容等*/let dataTypes = WKWebsiteDataStore.allWebsiteDataTypes()let date = Date.init(timeIntervalSince1970: 0)WKWebsiteDataStore.default().removeData(ofTypes: dataTypes, modifiedSince: date) {}

/**支持iOS8.0以上的清理方法*/let cachePath = NSHomeDirectory() + "/Library/Caches"let bundleId : String = Bundle.main.infoDictionary!["CFBundleIdentifier"] as! Stringlet webKitCachePath = cachePath+"/"+bundleId+"/WebKit"try!FileManager.default.removeItem(atPath: webKitCachePath)



作者:南南小生
链接:https://www.jianshu.com/p/09d77f003da6
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


若文章对您有帮助,帮忙点个赞!

0
-5
发布时间 2021-08-10 17:04:10
0 条回复(回复会通过微信通知作者)
点击加载更多评论
登录 后再进行评论
(微信扫码即可登录,无需注册)