Класс Reachability и -reachabilityWithHostname:
предназначены для быстрого и безотказного механизма определения наличия базового сетевого подключения к хосту. Если вам необходимо убедиться, что конкретный URL-адрес может быть загружен, вам нужно использовать NSURLConnection
для получения содержимого URL-адреса, чтобы убедиться, что он действительно доступен.
В зависимости от того, нужно ли вам делать это на переднем плане или на заднем плане, вы можете использовать простое, но блокирующее:
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
или вы можете использовать более сложный метод создания объекта NSURLConnection, настройки делегата для получения ответов и ожидания поступления этих ответов.
Для простого случая:
NSURL *myURL = [NSURL URLWithString: @"http://example.com/service.asmx"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myURL];
[request setHTTPMethod: @"HEAD"];
NSURLResponse *response;
NSError *error;
NSData *myData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error];
Если вы получите не ноль myData, у вас будет какое-то соединение. response
и error
сообщат вам, что сервер ответил вам (в случае ответа и если вы получили не ноль myData) или какая ошибка произошла в случае ноль myData.
Для нетривиального случая вы можете получить хорошее руководство от Apple Используя NSURLConnection .
Если вы не хотите останавливать процесс переднего плана, вы можете сделать это двумя разными способами. Приведенная выше документация предоставит информацию о том, как реализовать делегат и т. Д. Однако более простая реализация будет состоять в том, чтобы использовать GCD для отправки синхронного запроса в фоновом потоке, а затем отправлять сообщения в основной поток, когда вы закончите. *
Примерно так:
NSURL *myURL = [NSURL URLWithString: @"http://example.com/service.asmx"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myURL];
[request setHTTPMethod: @"HEAD"];
dispatch_async( dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_BACKGROUND, NULL), ^{
NSURLResponse *response;
NSError *error;
NSData *myData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error];
BOOL reachable;
if (myData) {
// we are probably reachable, check the response
reachable=YES;
} else {
// we are probably not reachable, check the error:
reachable=NO;
}
// now call ourselves back on the main thread
dispatch_async( dispatch_get_main_queue(), ^{
[self setReachability: reachable];
});
});