如果响应缓存既不包含Expires也不包含Cache-Control: max-age,那么可以强制进行响应缓存吗?
我看到了这的文章,但不幸的是,URLSession:dataTask:willCacheResponse:completionHandler:从未在我的AFHTTPSessionManager子类中被调用。
任何帮助都很感激。
发布于 2014-09-26 19:30:48
您可以通过实现不遵循标准HTTP缓存规则的自己的NSURLProtocol来强制缓存。一个完整的教程在这里,它使用核心数据来保存数据,但是基本步骤是:
NSURLProtocol+registerClass:注册您的子类YES,则在+canInitWithRequest:方法中返回request,如果不是,则返回NO您现在有两个选择:
假设您希望#2,则在您的协议子类中重写connection:didReceiveResponse:以创建一个响应,该响应具有您想要模拟的缓存控制头:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response {
// Create a dictionary with the headers you want
NSMutableDictionary *newHeaders = [response.allHeaderFields mutableCopy];
newHeaders[@"Cache-Control"] = @"no-transform,public,max-age=300,s-maxage=900";
// Create a new response
NSHTTPURLResponse *newResponse = [[NSHTTPURLResponse alloc] initWithURL:response.URL
statusCode:response.statusCode
HTTPVersion:@"HTTP/1.1"
headerFields:newHeaders];
[self.client URLProtocol:self
didReceiveResponse:newResponse
cacheStoragePolicy:NSURLCacheStorageAllowed];
}这将导致响应被缓存,就像服务器提供了这些头一样。
对于会话,您需要设置会话配置的protocolClasses。由于您使用的是AFNetworking,所以看起来如下:
[AFHTTPSessionManager sharedManager].session.configuration.protocolClasses = @[[MyURLProtocol class]]有一些警告,所以请确保您的文档。
几个注意事项:
https://stackoverflow.com/questions/25586244
复制相似问题