NSURLCache使用和UIWebView URL 拦截

现在因为项目需要更新版本,采用缓存的策略要发生改变。之前的版本在展示新闻后台返回的html内容所以之前的缓存策略只需要将html内容写入到文件中即可。现在新版本新闻详情的内容变得更加的复杂多样,所以现在直接的采用网页展示,也就是后台只会返回一个链接,至于UIwebView的缓存就需要自己去重新的定义了。

查了很多的博客和文档,发现webView本身是由缓存的,也就是NSURLCache,但是NSURLCache不满足需求,所以只能自己去定义。官方对NSURLCache虽然说是内存缓存和磁盘缓存相结合的,实际上只有内存缓存而且只有4M,另外就是现在混存的趋势时,定时清理,所以必须自己去复写NSURLCache来实现更多的需求。

(-)方法介绍

首先,看看NSURLCache的一些方法介绍:

初始化相关的几个方法:sharedURLCache;setSharedURLCache;initWithMemoryCapacity

(1) sharedURLCache方法返回一个NSURLCache实例。

默认情况下,内存是4M,4* 1024 * 1024;Disk为20M,20 * 1024 * 1024;路径在(NSHomeDirectory)/Library/Caches/(current application name, [[NSProcessInfo processInfo] processName])

(2)setSharedURLCache 可以通过这个方法来改变默认的NSURLCache。

(3)通过initWithMemoryCapacity 来定制自己的NSURLCache

cache使用相关的几个方法:

cachedResponseForRequest;//缓存请求

storeCachedResponse;//存储缓存

removeCachedResponseForRequest;//删除缓存请求

removeAllCachedResponses;//删除所以缓存请求

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request

//如果对应的NSURLRequest没有cached的response那么返回nil

- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request;

//为特定的NSURLRequest做cache

- (void)removeCachedResponseForRequest:(NSURLRequest *)request;

//移除特定NSURLRequest的cache

- (void)removeAllCachedResponses;

//移除所有的cache

(二)自定义cache

我们这边的需求将所有的数据写入到文件中,过期后将数据清除掉。所以我这里只需要重写

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)reques

这个方法即可

下面是核心代码:

#pragma mark - super

-(NSCachedURLResponse

*)cachedResponseForRequest:(NSURLRequest*)request{

if ([request.HTTPMethod compare:@"GET"] != NSOrderedSame) {

return [super cachedResponseForRequest:request];

}

return [self customResponseForRequest:request];

}

#pragma mark - private

-(NSString *)getFileName:(NSString *)url{

return [url getMd5_32Bit];

}

-(NSString *)getOtherInfoName:(NSString *)url{

return [[NSString stringWithFormat:@"%@-otherInfo",url] getMd5_32Bit];

}

- (NSString *)cacheFilePath:(NSString *)fileName{

NSString *filePath = [NSStringstringWithFormat:@"URLCache/%@",fileName];

NSString*path = kFilePathAtCachWithName(filePath);

NSFileManager *fileManager = [NSFileManager defaultManager];

BOOL isDir;

if([fileManager fileExistsAtPath:path isDirectory:&isDir] && isDir) {

} else{

[fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];

}

return path;

}

-(NSCachedURLResponse*)customResponseForRequest:(NSURLRequest*)request{

​NSString *url = request.URL.absoluteString;//请求的链接

NSString*fileName = [self getFileName:url];//缓存的文件名

NSString*otherInfoName = [self getOtherInfoName:url];//缓存信息的文件名

NSString*filePath = [self cacheFilePath:fileName];//缓存的目录路径

NSString*otherInfoPath = [self cacheFilePath:otherInfoName];//缓存信息字典路径

​NSFileManager *fileManger = [NSFileManager defaultManager];

if ([fileManger fileExistsAtPath:filePath]) {

​//当文件名存在的时候

NSDate*date = [NSDate date];

BOOL isOverdue = YES;

NSDictionary *dicInfo = [NSDictionarydictionaryWithContentsOfFile:otherInfoPath];

if(self.catchTime > 0 && dicInfo) {

NSDate*createDate = dicInfo[kTimeKey];

double createTime = [date timeIntervalSinceDate:createDate];

if (createTime < self.catchTime) {

isOverdue = NO;

}

}

if (!isOverdue) {

//

没有过期

//            NSLog(@"访问缓存数据

..");

NSData *data = [NSDatadataWithContentsOfFile:filePath];

NSURLResponse *response = [[NSURLResponse alloc] initWithURL:request.URL MIMEType:dicInfo[kMIMETypeKey] expectedContentLength:data.lengthtextEncodingName:dicInfo[kTextEncodingNameKey]];

NSCachedURLResponse *cacheResponse = [[NSCachedURLResponsealloc] initWithResponse:response data:data];

return cacheResponse;

}else{

//已经过期删除信息

[fileManger removeItemAtPath :filePath error:nil];

[fileManger removeItemAtPath :otherInfoPath error:nil];

}

}

BOOL isExsit = [[self.dicResponse objectForKey:url] boolValue];

if (!isExsit) {

[self .dicResponse setObject:@(YES) forKey:url];

//        NSLog(@"网络请求数据...");


__block NSCachedURLResponse *cacheResponse = nil;

[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse*response, NSData *data, NSError *connectionError) {

//移除请求记录

[self .dicResponse removeObjectForKey:url];

if (data && response) {

NSMutableDictionary *dicInfo = [NSMutableDictionarydictionary];

[dicInfo setObject :[NSDate date] forKey:kTimeKey];

[dicInfo setObject :kUnNilStr(response.MIMEType) forKey:kMIMETypeKey];

[dicInfo setObject :kUnNilStr(response.textEncodingName) forKey:kTextEncodingNameKey];

BOOL state = [data writeToFile:filePath atomically:NO];

NSLog(@"%d",state);

[dicInfo writeToFile :otherInfoPath atomically:YES];

cacheResponse = [[NSCachedURLResponse alloc] initWithResponse:response data:data];

}

}];

return cacheResponse;

}else{

//        NSLog(@"该请求已存在

...");

}

return nil;

}

ps: 这操蛋的博客,居然不支持代码格式,看上去怪怪的。

另外还可针对不同的请求来缓存,因为现在还没有这个需求,所以现在就没有添加进去。有不足的地方希望能收到更多的宝贵意见。

ps:ios8下面遇到的操蛋问题就是把NSURlCache必须设置在程序启动时才能有效,另外就是要区分非web的请求,只要在请求头中设置个判断的标志即可。此处不知道查了多少英文文档才知道这么点

本文链接http://blog.sina.com.cn/s/blog_7da8833c0102w2q7.html  在开始看iOS UIWebView URL拦截,看到这里,顺便就整理下http://www.cocoachina.com/ios/20150626/12161.html?utm_source=tuicool&utm_medium=referral

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,504评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,898评论 1 300
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,218评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,322评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,693评论 3 290
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,812评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,010评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,747评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,476评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,700评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,190评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,541评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,206评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,129评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,903评论 0 199
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,894评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,748评论 2 274

推荐阅读更多精彩内容