Я пытаюсь использовать NSURLRequestUseProtocolCachePolicy
, чтобы приложение загружало ответ из кэша при выполнении второго запроса POST к серверу. Но он никогда не загружает ответ из кэша.
Простой тест, который я использую:
- (void) main {
[[NSURLCache sharedCache] removeAllCachedResponses];
for(int i=0; i<2; i++) {
[self runTest];
}
}
- (void) runTest {
NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"http://localhost:9000/test-server/api/testforpost"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.cachePolicy = NSURLRequestUseProtocolCachePolicy;
request.HTTPMethod = @"POST";
dispatch_semaphore_t sessionRequestLock = dispatch_semaphore_create(0);
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
NSLog(@"Status: %i", httpResponse.statusCode);
NSLog([[httpResponse allHeaderFields] description]);
NSString *dataString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"data: %@", dataString);
dispatch_semaphore_signal(sessionRequestLock);
}];
[task resume];
dispatch_semaphore_wait(sessionRequestLock, DISPATCH_TIME_FOREVER);
}
Я также управляю сервером, который устанавливает заголовок Cache-Control
. Я также вижу на сервере, что API вызывается дважды в этом примере (показывая, что локальный iOS кэш приложения не используется).
В этом примере печатаются заголовки:
"Cache-Control" = "max-age=2000,public";
"Content-Disposition" = "inline; filename=\"testFile.html\"";
"Content-Length" = 138;
"Content-Type" = "text/html";
"Referrer-Policy" = "origin-when-cross-origin, strict-origin-when-cross-origin";
"X-Frame-Options" = DENY;
"X-Permitted-Cross-Domain-Policies" = "master-only";
"X-XSS-Protection" = "1; mode=block";
Если я установлю cachePolicy следующим образом:
request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
, тогда ответ на второй запрос будет правильно извлечен из кэша.
Есть идеи о том, что мне не хватает, чтобы NSURLRequestUseProtocolCachePolicy
работал правильно?