2012-03-08 3 views
7

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

благодарит заблаговременно.

+1

достижимости только там, чтобы проверить, если у вас есть доступ в Интернет, так что вы можете определить, если вы должны предупредить пользователя и, следовательно, использовать кэшированные данные. Это часть принципов Apple для взаимодействия с пользователем. Если вы хотите проверить конкретный URL-адрес, попробуйте его получить, установив тайм-аут очень маленьким и поймав ошибку. –

ответ

18

Класс 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]; 

Если вы получаете обратно on-nil myData, у вас есть какая-то возможность подключения. response и error расскажут вам, что сервер ответил вам (в случае ответа и если вы получили не-nil myData) или какая ошибка произошла, в случае с nil myData.

Для нетривиального случая вы можете получить хорошее руководство от Apple Using 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]; 
     }); 
}); 
+0

можете ли вы представить простой пример того, как это сделать в фоновом режиме, чтобы предотвратить зависание приложения? – JAHelia

+0

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

+0

потрясающий! в приведенном выше коде есть небольшая ошибка, вы должны установить достижимый = YES в первом случае if и NO во втором операторе if. Большое спасибо. – JAHelia

5

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

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