Класс 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];
});
});
достижимости только там, чтобы проверить, если у вас есть доступ в Интернет, так что вы можете определить, если вы должны предупредить пользователя и, следовательно, использовать кэшированные данные. Это часть принципов Apple для взаимодействия с пользователем. Если вы хотите проверить конкретный URL-адрес, попробуйте его получить, установив тайм-аут очень маленьким и поймав ошибку. –