проверка доступности по определенной странице в URL - PullRequest
7 голосов
/ 08 марта 2012

После того, как я прочитал ответ для на этот вопрос , я обнаружил, что использование reachabilityWithHostName не работает с таким URL-адресом, как этот: mySite.com/service.asmx, есть ли способ проверить доступность по этому URL-адресу используя reachabilityWithHostName или любой reachability метод класса?

Большое спасибо заранее.

Ответы [ 2 ]

18 голосов
/ 08 марта 2012

Класс 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];
      });
 });
6 голосов
/ 08 марта 2012

Если вы хотите проверить достижимость по URL (обычно используется по отношению к имени хоста), просто сделайте запрос HEAD, используя NSURLConnection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...