Определение состояния сети (Reachability, iOS, Xcode 4.2)

Уроки по созданию приложений для iOS (iPhone, iPad, iPod Touch) в Xcode (Objective-C)
Ответить
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Определение состояния сети (Reachability, iOS, Xcode 4.2)

Сообщение Александр »

Определение состояния сети (Reachability, iOS, Xcode 4.2)
Objective-C 2.0, iPhone, iPod, iPad, iOS, iOS 5, Reachability

Если для работы вашего приложения необходимо подключение к интернету, то проверить состояние подключения к сети можно с помощью класса Reachability.
Класс даёт возможность определить подключено ли устройство в данный момент к интернеру и каким способом: Wi-Fi или WWAN (3G или EDGE).

С помощью Reachability можно проверить:
- reachabilityWithHostName - проверка доступности конкретного имени хоста.
- reachabilityWithAddress - проверка доступности конкретного IP-адреса.
- reachabilityForInternetConnection - проверка доступности интернет соединения.
Нужно использовать если приложение взаимодействует не только с одним сервером.
- reachabilityForLocalWiFi - проверка Wi-Fi-соединения.

Скачать класс можно на странице http://developer.apple.com/library/ios/ ... Intro.html
Вверху есть кнопка Download Sample Code. На данный момент последняя версия Reachability 2.2 (2010-07-20).
Reachability 2.2 с сайта developer.apple.com не подходит для Xcode при работе с Automatic Reference Counting (ARC). Но нашлись люди, которые переделали этот класс https://github.com/rifatdover/ReachabilityForIOS5

Скачайте необходимый для вас вариант класса.


Для того чтобы работать с Reachability, неоходимо добавить в проект фреймворк SystemConfiguration.
Это можно сделать в свойствах проекта Build Phases - Link Binary With Libraris

Изображение


Проверка состояния по нажатию на кнопку

ViewController.h

Код: Выделить всё

#import <UIKit/UIKit.h> @interface ViewController : UIViewController {    IBOutlet UILabel *label;} - (IBAction)check:(id)sender; @end

ViewController.m

Код: Выделить всё

#import "Reachability.h" // … - (IBAction)check:(id)sender{    // проверяем доступность конкретного сервера    // NetworkStatus netStatus = [[Reachability reachabilityWithHostName:@"flapps.ru"] currentReachabilityStatus];     // проверяем интернет соединение    NetworkStatus netStatus = [[Reachability reachabilityForInternetConnection] currentReachabilityStatus];        switch (netStatus) {        case NotReachable: {            label.text = @"Access Not Available";            break;        }                    case ReachableViaWWAN: {            label.text = @"Reachable WWAN";            break;        }        case ReachableViaWiFi: {            label.text = @"Reachable WiFi";            break;        }    }    }

Если появляется предупреждение

Код: Выделить всё

warning: declaration of 'struct sockaddr_in' will not be visible outside of this function
добавляем в Reachability.h

Код: Выделить всё

#import <netinet/in.h>



Отлеживание изменения состояния сети

Для контроля состояния сети используется NSNotificationCenter.
Подробнее можно почитать в документации http://developer.apple.com/library/mac/ ... rence.html

ViewController.h

Код: Выделить всё

#import <UIKit/UIKit.h> @class Reachability; @interface ViewController : UIViewController {        IBOutlet UILabel *label;        Reachability *internetReach;} @end
ViewController.m

Код: Выделить всё

- (void) updateInternetStatus: (Reachability*) curReach{    // определяем состояние    NetworkStatus netStatus = [curReach currentReachabilityStatus];    NSString* statusString= @"";        switch (netStatus) {        case NotReachable: {            statusString = @"Access Not Available";            break;        }        case ReachableViaWWAN: {            statusString = @"Reachable WWAN";            break;        }        case ReachableViaWiFi: {            statusString = @"Reachable WiFi";            break;        }    }        label.text = statusString;}  // вызывается при обнаружении изменения состояния- (void) reachabilityChanged: (NSNotification* )note{    Reachability* curReach = [note object];    NSParameterAssert([curReach isKindOfClass: [Reachability class]]);    [self updateInternetStatus: curReach];} - (void)viewDidLoad{    [super viewDidLoad];        // наблюдаем за изменением состояния сети    // при изменении вызовем reachabilityChanged    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];     // проверяем доступность интернет соединения    internetReach = [[Reachability reachabilityForInternetConnection] retain];    [internetReach startNotifier];    // узнаем состояние сети при запуске приложения    [self updateInternetStatus: internetReach];}

Таким же образом можно узнавать о изменении статуса доступности сервера

Код: Выделить всё

    // проверяем доступность определенного сервера    hostReach = [[Reachability reachabilityWithHostName: @"flapps.ru"] retain];    [hostReach startNotifier];    [self updateInternetStatus: hostReach];
и wi-fi

Код: Выделить всё

    // проверяем доступность соединения wi-fi    wifiReach = [[Reachability reachabilityForLocalWiFi] retain];    [wifiReach startNotifier];    [self updateInternetStatus: wifiReach];

Более подробный пример работы с автоматическим определением изменения состояния конкретного подключения можно посмотреть в примере в архивом скаченного с http://developer.apple.com/library/ios/ ... Intro.html.

Чтобы более детально разобраться в работе с сетью в iOS полезно прочитать про SCNetwork https://developer.apple.com/library/mac ... index.html
Ответить