2013-05-16 4 views
1

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

Другие StackOverflow вопросы, которые, казалось бы, чтобы ответить на этот вопрос, не работают:
1. How could connectionDidFinishLoading: run if no file is found on server?
2. Testing use of NSURLConnection with HTTP response error statuses

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

-(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");   
} 
+0

Вы делаете что-нибудь, чтобы предотвратить кеширование первого ответа, который вы получаете? – Wain

+0

Как предотвратить кеширование первого ответа? поскольку переменные не входят в объем каждого метода, казалось бы, что они исчезли к моменту следующего запроса. Кстати, я использую ARC. –

+0

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

ответ

0

Благодаря Wain и Робом за поставив меня на правильный путь. Один из способов сохранения кеша заключается в добавлении этого метода к вашему NSURLConnectionDelegate:

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

Попробуйте с установкой cachePolicy в NSURLRequestReloadIgnoringCacheData при построении объект NSURLRequest

Смежные вопросы