Наши требования включают проверку доступа в Интернет к определенному файлу на веб-сервере. Этот файл проверяется каждые 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");
}
Вы делаете что-нибудь, чтобы предотвратить кеширование первого ответа, который вы получаете? – Wain
Как предотвратить кеширование первого ответа? поскольку переменные не входят в объем каждого метода, казалось бы, что они исчезли к моменту следующего запроса. Кстати, я использую ARC. –
Предполагая, что вы работаете с последней версией iOS, NSURLCache будет автоматически кэшировать ответы (в зависимости от возвращенных заголовков). – Wain