2016-11-28 16:45:33 +08:00
2016-11-21 17:11:59 +08:00
2016-11-28 16:45:33 +08:00
2016-11-28 16:45:33 +08:00

ASHWebURLProtocol

iOS WebView缓存 ###首先继承 NSURLProtocol

+(BOOL)canInitWithRequest:(NSURLRequest *)request
{
    
    ///通过UA 来判断是否UIWebView发起的请求
    NSString* UA = [request valueForHTTPHeaderField:@"User-Agent"];
    if ([UA containsString:@" AppleWebKit/"] == NO) {
        return NO;
    }
    
    if ([request valueForHTTPHeaderField:kHTTPHeaderField]) {
        return NO;
    }
    return YES;
}

NSString* UA = [request valueForHTTPHeaderField:@"User-Agent"]; 中可以判断是否是WebView发出的请求。 当判断是WebView的时候才进行处理。

- (void)startLoading
{
    
    
    NSString *cachesPath = [self cachePathForRequest:[self request]];
    ASHCachedData *cache = [NSKeyedUnarchiver unarchiveObjectWithFile:cachesPath];
    
    //使用缓存。
    if (cache) {
        NSData *data = cache.data;
        
        [[self client] URLProtocol:self didReceiveResponse:cache.response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
        [[self client] URLProtocol:self didLoadData:data];
        [[self client] URLProtocolDidFinishLoading:self];
        //        return;
    }
    
    //重新请求。
    NSMutableURLRequest *newRequest = [self.request mutableCopy];

    [newRequest setValue:@"" forHTTPHeaderField:kHTTPHeaderField];
    [newRequest setCachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData];
    
    self.connection = [NSURLConnection connectionWithRequest:newRequest
                                                                delegate:self];
    
}

###上面是主要的代码,先使用了缓存,然后再去重新请求,这样就会刷新请求数据.

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [self.client URLProtocolDidFinishLoading:self];
    
    NSString *cachesPath = [self cachePathForRequest:[self request]];
    
    
    
    ASHCachedData *cache = [ASHCachedData new];
    cache.data = [self data];
    cache.response = [self response];
    
    [NSKeyedArchiver archiveRootObject:cache toFile:cachesPath];
}

最后一段就是对内容进行保存,当然也可以根据后缀把图片单独用SDWebImage保存,可以和原生代码里面的图片共用缓存。

###最后还需要注册一下 在 AppDelegate

[NSURLProtocol  registerClass:[ASHWebNSURLProtocol class]];
S
Description
GitHub 镜像: wu736139669/ASHWebURLProtocol(每日自动同步)
Readme
89 KiB
Languages
Objective-C 100%