Как проверить состояние сети в приложении iphone?
Я установил некоторые методы для проверки состояния сети в моем приложении.
В моем методе viewDidLoad
я вызываю initNetworkCheck
:
[self initNetworkCheck];
[super viewDidLoad];
if(internetActive == NO){
compose.enabled = NO;
}
Поэтому я хочу проверить при запуске, есть ли у оборудования подключение к интернету. Проблема в том, что он всегда дает мне нет, но internetActive на самом деле да, когда я регистрирую его.
//[[[[[[network check methods
-(void)checkNetworkStatus:(NSNotification *)notice{
NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
switch (internetStatus) {
case NotReachable:{
self.internetActive = NO;
break;
}
case ReachableViaWiFi:{
self.internetActive = YES;
break;
}
case ReachableViaWWAN:{
self.internetActive = YES;
break;
}
}
NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
switch (hostStatus){
case NotReachable:{
self.hostActive = NO;
break;
}
case ReachableViaWiFi:{
self.hostActive = YES;
break;
}
case ReachableViaWWAN:{
self.hostActive = YES;
break;
}
}
}
-(void)initNetworkCheck{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];
internetReachable = [[Reachability reachabilityForInternetConnection] retain];
[internetReachable startNotifier];
hostReachable = [[Reachability reachabilityWithHostName:@"www.google.com"] retain];
[hostReachable startNotifier];
}
//]]]]]]
Есть идеи?
2 ответа:
Я предлагаю использовать класс достижимости Apple. здесь - пример приложения от Apple.
Пример приложения достижимости демонстрирует, как использовать Основы конфигурация для мониторинг состояния сети iPhone или iPod touch. В частности, это демонстрирует, как узнать, когда IP может маршрутизироваться и когда трафик будет маршрутизируется через беспроводную широкую область Сетевой интерфейс (WWAN), такой как EDGE или 3G.
Я лично использую следующее:
typedef enum { NoConnection = 0, WiFiConnected, WWANConnected } NetworkStatus; NetworkStatus getNetworkStatus ( ) { struct sockaddr_in nullAddress; bzero(&nullAddress, sizeof(nullAddress)); nullAddress.sin_len = sizeof(nullAddress); nullAddress.sin_family = AF_INET; SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*) &nullAddress); SCNetworkReachabilityFlags flags; SCNetworkReachabilityGetFlags(ref, &flags); if (!(flags & kSCNetworkReachabilityFlagsReachable)) return NoConnection; if (!(flags & kSCNetworkReachabilityFlagsConnectionRequired)) return WiFiConnected; if (((flags & kSCNetworkReachabilityFlagsConnectionOnDemand) || (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic)) && !(flags & kSCNetworkReachabilityFlagsInterventionRequired)) return WiFiConnected; if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) return WWANConnected; return NoConnection; }
Я забыл, где именно, но где-то в SDK есть пример, на котором это основано.
EDIT: похоже, Ник нашел его... :)