Не удается отключить кэширование сетевых запросов в приложении на Objective-c

Пытаюсь устранить неправильную работу сетевых запросов в чужом приложении. При повторной отправке сетевого запроса данные возвращаются старые (видимо из кэша), перелопатил весь код, но известных мне методов настройки параметров кэширования сетевых запросов не обнаружил.

Пробовал:

  1. Отключать кэширование в http-заголовке запроса

    [request setValue:@"no-cache" forHTTPHeaderField:@"Cache-Control"];

  2. Отключать кэширование в configuration сессии

    config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; config.URLCache = nil;

  3. Пробовал устанавливать режим без кэша в параметре самого запроса

    [request setCachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData];

Никаких изменений... Что еще можно посмотреть, где отключить кэширование, если кто сталкивался - помогите, уже третий день ковыряюсь.

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: url1]];
    [request setHTTPMethod: @"GET"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody: [requestData requestData]];
     NSInputStream* bodyStream = [requestData HTTPBodyStream];

    if (bodyStream != nil)
        request.HTTPBodyStream = bodyStream;

    NSURLSessionConfiguration* configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];

    configuration.timeoutIntervalForResource = 30;
    configuration.timeoutIntervalForRequest = 30;
        
    _session = [[NSURLSession sessionWithConfiguration:configuration] retain]
    _statusCodes = [[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 5)] retain];


void (^taskCompletionHandler)(NSData* data, NSURLResponse* response, NSError* error) = ^(NSData* data, NSURLResponse* response, NSError* error)
    {
        NSUInteger responseStatusCode = 500;
        if ([response isKindOfClass:[NSHTTPURLResponse class]]) 
    {
                responseStatusCode = ((NSHTTPURLResponse*)response).statusCode;
    }

        if (_statusCodes != nil && ![_statusCodes containsIndex:responseStatusCode] && [response URL] && error == nil)
        {
                NSDictionary* errorUserInfo = [NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:NSLocalizedStringFromTable(@"Request failed: %@ (%ld)", @"CoreNetworking", nil),            [NSHTTPURLResponse localizedStringForStatusCode:responseStatusCode], (long)responseStatusCode], NSLocalizedDescriptionKey, [response URL], NSURLErrorFailingURLErrorKey, nil];

                error = [NSError errorWithDomain:MyNetworkingErrorDomain code:responseStatusCode userInfo:errorUserInfo];
        }

        MyHTTPResponse* responseObject = [MyHTTPResponse responseWithHTTPURLResponse:(NSHTTPURLResponse*)response data:data error:error];

        if (completionHandler != nil) {
            completionHandler(responseObject);
        }   
    };

    NSURLSessionDataTask* task = [self.anURLSession dataTaskWithRequest:request completionHandler:taskCompletionHandler];

    [task resume];

Ответы (3 шт):

Автор решения: VAndrJ

Не просто ковыряйтесь, а общайтесь. Если со своей стороны уже попробовали стандартные вещи, проверили как-то по-другому, тогда может "проблема на стороне мишени"? Узнайте подробности работы бекенда. Может у них кеширование как-то настроено, может мощности не хватает, может так организованы хранение и обработка данных.

Упрощенный пример по мотивам реальной проблемы (точнее, такая работа считалась нормальной для того случая, но в контексте Вашего вопроса - проблема): часть данных хранилась в одном месте, часть в другом, статистика в третьем. И вот статистика всегда запаздывала по данным, так как потихоньку собиралась по другим местам. И когда нужно было забрать сводные данные - пользователю не показывалось самое свежее в реальном времени, так как это было бы очень накладно по ресурсам.

→ Ссылка
Автор решения: schmidt9

Кеширование можно попытаться отключить с помощью EVURLCache.

Вот так я отключал кеширование для API гугл карт

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [EVURLCache activate];
    [EVURLCache setIgnoredMasks:@[@"maps\\.googleapis\\.com\\/maps\\/api\\/place"]];
    
    return YES;
}
→ Ссылка
Автор решения: Пётр Иванов

На четвертый день поисков нашел метод с заурядным названием: clearTemp, он и чистил кэш, создаваемый вручную. Банально :(

Всем спасибо.

→ Ссылка