Содержание
Задача проверки подключения к сети достаточно популярная и встречается в большинстве приложений. Самое простое что может прийти на ум — попытаться загрузить главную страничку какого-либо сайта. Но это не самый лучший вариант. Во-первых он требует загрузки данных; во-вторых если ресурс недоступен — нам нужно будет дождаться тайм-аута, который по-умолчанию составляет 30 секунд (но его можно и изменить); в третьих — … и так далее.
Apple предлагает класс, который называется Reachability. Этот класс несуществует в iOS SDK, но его исходный код можно загрузить с сайта developer.apple.com отсюда. По ссылке — проект, демонстрирующий возможности Reachability. Загрузить его можно нажав кнопку «Download Sample code». Чтобы подключить к вашему проекту этот класс, нужно скопировать и добавить в проект два файла — Reachability.h и Reachability.m. Так же требуется добавить в проект SystemConfiguration-framework.
Каждый созданный объект класса Reachability информирует нас о доступности конкретного вида подключения либо хоста. Это значит, что для проверки доступности сайта http://apple.com и http://google.com нам понадобятся разные объекты Reachability. Хотя, можно просто проверить доступность интернета.
Проверка соеденения до конкретного хоста
Итак, класс Reachability добавлен в проект и SystemConfiguration-framework подключен. Чтобы проверить соеденение до конкретного хоста, создадим объект Reachability следующим образом:
Reachability* appleReachability = [Reachability reachabilityWithHostName: @"www.apple.com"];
Конечно же, в любой момент времени мы можем захотеть проверить состояние подключения/доступности. Делается это путем проверки свойства currentReachabilityStatus:
NetworkStatus status = appleReachability.currentReachabilityStatus;switch (status) { case NotReachable: // хост недоступен break;
case ReachableViaWiFi: // доступен через WiFi break;
case ReachableViaWWAN: // доступен через 3G или EDGE break; }
Проверка подключения к интернету и к Wi-Fi
Чтобы проверять подключение к интернету, нужно создать Reachablility следующим образом:
Reachability* internetReachability = [Reachability reachabilityForInternetConnection];
Для проверки подключения к Wi-Fi:
Reachability* wifiReachability = [Reachability reachabilityForLocalWiFi];
Проверка состояния осуществляется все так же через свойство currentReachabilityStatus.
Уведомление об изменении состояния
Конечно же, можно всегда вручную проверять состояние подключения, но можно и получать уведомления об изменении состояния. Для этого нужно подписаться на kReachabilityChangedNotification:
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];
И, конечно же, определить метод, который будет слушать уведомление:
- (void) reachabilityChanged: (NSNotification* )note { Reachability* curReach = [note object]; NetworkStatus status = curReach.currentReachabilityStatus;switch (status) { case NotReachable: // хост недоступен break;
case ReachableViaWiFi: // доступен через WiFi break;
case ReachableViaWWAN: // доступен через 3G или EDGE break; } }
После подписки на уведомления, нужно «попросить» объект Reachability генерировать уведомления об изменении состояния:
Reachability* internetReachability = <#объект Reachability#>; [internetReachability startNotifier];
Теперь мы будем получать уведомления об изменении состояния подключения.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: