项目中如需缓存UIWebView浏览过的数据,简单说就是加载过的网页数据,在没有网络的情况下依然能查看,很显然就需要用到缓存机制,纵览各大技术平台,开源库,首选的恐怕就是这个库了,其它的就算了吧
知名三方缓存库:RNCachingURLProtocol
Github下载地址:https://github.com/rnapier/RNCachingURLProtocol
参考资料:http://robnapier.net/offline-uiwebview-nsurlprotocol
使用方法非常简单,三步搞定:
To build, you will need the Reachability code from Apple (included). That requires that you link withSystemConfiguration.framework.
At some point early in the program (usually application:didFinishLaunchingWithOptions:), call the following:
[NSURLProtocol registerClass:[RNCachingURLProtocol class]];
There is no step 3.(笔者备注:大哥,你总得引入头文件吧,这难道不是第三步#import "RNCachingURLProtocol.h)
当然,还有很多其他方案,看源码,其实就是用到了NSURLProtocol协议来完成的下载缓存,再通过加密来实现;
问题来了,这个库很简单,简单到如果想清除缓存,对不起,它没有给你提供方法,去吧,搜索网络资源,很疑惑,居然没有一个针对它的解决方案,即如何清除缓存的web数据?
解决步骤:
1,直接用这句代码:[[NSURLCache sharedURLCache] removeAllCachedResponses];,既然是遵循的NSURLProtocol,那么和它一个级别的NSURLCache应该也可以吧,对不起,一点效果也没有,其实这个方法只能清除UIWebView加载到内存的数据,而RNCachingURLProtocol库是缓存了哈希后的数据到磁盘,确切的说是Library/Caches文件夹下;
2,继续查看RNCachingURLProtocol源码,发现在序列化后是存在了一个路径下:
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *fileName = [[[aRequest URL] absoluteString] sha1];
那思路就清晰了,清除方法就是直接移除该目录下的数据,想法很美好,线上就是告诉你,总是删除错误,删除路径代码:
[[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
郁闷后继续找方案,该文件夹其实是存储了很多本APP需要临时缓存的数据,自然一股脑遍历删除肯定会报错,好了,那么就有针对性的去删除,定位打印到该目录下数据如下:
lldb) po subPathArr
<__NSArrayM 0x174458c90>(
.umeng,
.umeng/1510055179347_envelope.log,
.umeng/exchangeIdentity.json,
0213a5dccbea55ab12ef2d3fd3873e15483e0e91,
0477ae9f85892e1a3da250d660aec51e54da6cfc,
068c38d116e160f369a818b58d08daa585e2948e,
0979ce51418a9cbb96585347efa5a978d3846de4,
204402073d832218eb95c5a8e1e527fbe7ee9007,
51db63873692cf939eb759648179b376e7c96de6,
97569efa9832a6e7ceb34f29ea8a6672c97a2f5d,
9df7fada3d3d29a6a4584ddb1b0f46569f0b3ef1,
上面的sha1后就是这些路径:
(lldb) po filePath
/var/mobile/Containers/Data/Application/339C1C5B-E616-4784-98D7-9786853FB727/Library/Caches/0213a5dccbea55ab12ef2d3fd3873e15483e0e91
好了,既然知道了,那就好办了,下一步就是有针对性的删除了;
3,既然有些不是我们该删除就是不要去删除了,直接删除RNCachingURLProtocol缓存的那些路径数据,代码如下:
for (NSString *subPath in subPathArr)
{
filePath = [path stringByAppendingPathComponent:subPath];
if (subPath.length==40) {
//删除子文件夹
[[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
if (error) {
return NO;
}
}
}
return YES;
终于,完美解决了无法清除RNCachingURLProtocol缓存的数据问题了,也算给互联网一个交代。
良心APP推荐:IT面试宝典