iOS NSURL запрашивает код состояния всегда 200

Наши требования включают проверку доступа в Интернет к конкретному файлу на веб-сервере. Этот файл проверяется каждые n минут. NSURLRequests никогда не вызывает соединение:didFailWithError, независимо от того, существует ли интернет-соединение. И HTTP-статус всегда равен 200. Доступность Apple работает только для доменов, а не для файлов, поэтому она не соответствует требованиям. Как я могу достоверно определить, могу ли я обращаться к этому файлу каждые n минут? Почему код статуса http на самом деле не код статуса http?

Другие вопросы о стековом потоке, которые могли бы ответить на этот вопрос, не работают:
1. Как может connectionDidFinishLoading: работать, если на сервере не найдено ни одного файла?
2. Тестирование использования NSURLConnection со статусами ошибок ответа HTTP

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

-(void) updateConnectionStatus 
{   
    NSURL *url = [NSURL URLWithString:(NSString*)[appValues getValueForSettingsKey:@"company.project.test.pingURL"]];
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
    //NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    //__block __typeof__(self) _self = self;
    connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
 /*
    [NSURLConnection
    sendAsynchronousRequest:urlRequest queue:queue
        completionHandler:^(NSURLResponse *response,
                         NSData *data,
                         NSError *error) {

         NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
         int code = [httpResponse statusCode]; // ALWAYS 200 no matter what
         NSString *pingFile = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
         NSLog(@"%@",error); // NEVER has an error
         //This doesn't even work because it remembers FOREVER the value once it gets it.
         if ([@"Ping!" isEqualToString:pingFile])  
         {
             dispatch_async(dispatch_get_main_queue(), ^{                     
                 [_self companyConnection:YES];                     
             });                 
         } else {
             dispatch_async(dispatch_get_main_queue(), ^{                     
                 [_self companyConnection:NO];                     
             });
         }         
     }];
      */
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"ERROR:  %@", error); // Never get here 
}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSHTTPURLResponse *aResponse = (NSHTTPURLResponse*)response;
    NSLog(@"received a response: %ld",(long)[aResponse statusCode] );
    if ([response respondsToSelector:@selector(statusCode)])
    {
        int statusCode = [((NSHTTPURLResponse *)response) statusCode];
        // statusCode is always 200
        if (statusCode >= 400)
        {
            [companyConnection cancel];  // stop connecting; no more delegate messages
            NSDictionary *errorInfo
            = [NSDictionary dictionaryWithObject:[NSString stringWithFormat:
                                                  NSLocalizedString(@"Server returned status code %d",@""),
                                                  statusCode]
                                          forKey:NSLocalizedDescriptionKey];
        }
    }
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSLog(@"received data");
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"Finished");        
}

2 ответа

Решение

Спасибо Уэйну и Робу за то, что поставили меня на правильный путь. Один из способов сохранить кэш-память - добавить этот метод в NSURLConnectionDelegate:

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
    return nil;
}

Попробуйте установить параметр cachePolicy как NSURLRequestReloadIgnoringCacheData при создании объекта NSURLRequest.

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