NSURLCache不会清除iOS8中存储的响应

时间:2014-10-08 15:11:42

标签: ios objective-c caching ios8 nsurlcache

以下是我需要清除缓存并对URL进行新调用时调用的示例函数

- (void)clearDataFromNSURLCache:(NSString *)urlString
{
    NSURL *requestUrl = [NSURL URLWithString:urlString];
    NSURLRequest *dataUrlRequest = [NSURLRequest requestWithURL: requestUrl];

    NSURLCache * cache =[NSURLCache sharedURLCache];


    NSCachedURLResponse* cacheResponse =[cache cachedResponseForRequest:dataUrlRequest];

    if (cacheResponse) {
        NSString* dataStr = [NSString stringWithUTF8String:[[cacheResponse data] bytes]];
        NSLog(@"data str r= %@",dataStr);
        NSLog(@"url  str r= %@",[[[cacheResponse response] URL] absoluteString]);
        [cache storeCachedResponse:nil forRequest:dataUrlRequest];
        [NSURLCache setSharedURLCache:cache];
    }

    [[NSURLCache sharedURLCache] removeCachedResponseForRequest:dataUrlRequest];

    //Check if the respnase data has been removed/deleted from cache
    NSURLRequest *finalRequestUrlRequest = [NSURLRequest requestWithURL:requestUrl];
    NSURLCache * finalCache =[NSURLCache sharedURLCache];

    NSCachedURLResponse* finalcacheResponse =[finalCache cachedResponseForRequest:finalRequestUrlRequest];

    if (finalcacheResponse) {
        //Should not enter here
        NSString* finaldataStr = [NSString stringWithUTF8String:[[finalcacheResponse data] bytes]];
        NSLog(@"data str r= %@",finaldataStr);
        NSLog(@"url  str r= %@",[[[cacheResponse response] URL] absoluteString]);
    }
}

在iOS 6/7中,requestURL的响应被成功删除,但在iOS 8中它永远不会被删除。 我已搜索但无法找到原因,这在iOS8中不起作用。

任何帮助将不胜感激...... ..

3 个答案:

答案 0 :(得分:21)

NSURLCache在iOS 8.0.x上被破坏 - 它根本不会清除缓存,因此它会不受限制地增长。有关详细调查,请参阅http://blog.airsource.co.uk/2014/10/11/nsurlcache-ios8-broken/。缓存清除在8.1测试版中得到修复 - 但removeCachedResponseForRequest: 不是

removeCachedResponsesSinceDate: 似乎可以在iOS 8.0上运行 - 这是一个为8.0添加的API,但尚未进入文档(它位于API差异中)。我不清楚它对任何人有什么用处 - 当然你通常要做的是在特定日期之前删除缓存的响应

removeAllCachedResponses也可以 - 但这是一个真正的大锤解决方案。

答案 1 :(得分:0)

我获得了足够的结果来重置特定URL的缓存响应,将缓存控制更改为永远不会返回的内容,例如" max-age = 0"在标题中。 Look here

答案 2 :(得分:0)

无论何时生成任何API调用,该响应都会保存在缓存中。您可以在文档目录中找到该文件夹​​,然后创建一个名为cachedb的文件夹,其中包含响应列表。这可能是与安全性相关的主要问题。使用任何第三方工具,任何人都可以访问该信息。

以下是我解决此问题的方法:

NSURLCache * cache = [[NSURLCache alloc] initWithMemoryCapacity:0 * 1024 * 1024 diskCapacity:0 * 1024 * 1024 diskPath:nil]; [NSURLCache setSharedURLCache:cache];

我为缓存分配了0个内存空间。因此不会将任何数据存储在缓存中。