知名三方库 RNCachingURLProtocol 之清除缓存方案

项目中如需缓存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面试宝典

你可能感兴趣的:(知名三方库 RNCachingURLProtocol 之清除缓存方案)