Задача проверки подключения к сети достаточно популярная и встречается в большинстве приложений. Самое простое что может прийти на ум — попытаться загрузить главную страничку какого-либо сайта. Но это не самый лучший вариант. Во-первых он требует загрузки данных; во-вторых если ресурс недоступен — нам нужно будет дождаться тайм-аута, который по-умолчанию составляет 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];

Теперь мы будем получать уведомления об изменении состояния подключения.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *