NSURLCache не очищает сохраненные ответы в iOS8
Вот пример функции, которую я вызываю, когда мне нужно очистить кеш и сделать новый вызов 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.
Любая помощь будет оценена...
2 ответа
NSURLCache
на iOS 8.0.x не работает - он вообще не очищает кеш, поэтому растет без ограничений. См. http://blog.airsource.co.uk/2014/10/11/nsurlcache-ios8-broken/ для подробного расследования. Очистка кэша исправлена в бета-версиях 8.1 - но removeCachedResponseForRequest:
нет
removeCachedResponsesSinceDate:
похоже, работает на iOS 8.0 - API, который был добавлен для 8.0, но еще не попал в документы (он есть в разнице API). Мне непонятно, для кого это нужно - наверняка вы обычно хотите удалить кэшированные ответы до определенной даты.
removeAllCachedResponses
работает также - но это реальное решение кувалдой.
Я получил достаточный результат, сбросив кэшированный ответ для определенного URL, изменив элемент управления кэшем на что-то, что никогда не будет возвращено, например, "max-age=0" в заголовке. Смотри сюда
Каждый раз, когда генерируется любой вызов API, этот ответ сохраняется в кеше. Вы можете найти эту папку в своем каталоге документов, создается папка с именем cachedb, которая содержит список ответов. Это может быть серьезной проблемой, связанной с безопасностью. С помощью любого стороннего инструмента кто-то может получить доступ к этой информации.
Вот как я решил эту проблему:
NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:0 * 1024 * 1024 diskCapacity:0 * 1024 * 1024 diskPath:nil];[NSURLCache setSharedURLCache: кеш];
Я выделил для кеша 0 единиц памяти. поэтому никакие данные не будут храниться в кэш-памяти.