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 единиц памяти. поэтому никакие данные не будут храниться в кэш-памяти.

Другие вопросы по тегам