Определение состояния сети (Reachability, iOS, Xcode 4.2)
Добавлено: 18 мар 2012, 21:30
Определение состояния сети (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
ViewController.m
Если появляется предупреждение
добавляем в Reachability.h
Отлеживание изменения состояния сети
Для контроля состояния сети используется NSNotificationCenter.
Подробнее можно почитать в документации http://developer.apple.com/library/mac/ ... rence.html
ViewController.h
ViewController.m
Таким же образом можно узнавать о изменении статуса доступности сервера
и wi-fi
Более подробный пример работы с автоматическим определением изменения состояния конкретного подключения можно посмотреть в примере в архивом скаченного с http://developer.apple.com/library/ios/ ... Intro.html.
Чтобы более детально разобраться в работе с сетью в iOS полезно прочитать про SCNetwork https://developer.apple.com/library/mac ... index.html
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
Код: Выделить всё
#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
Код: Выделить всё
- (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 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