2011-04-14 185 views
4

我已經設置了一些方法來檢查我的應用中的網絡狀態。如何檢查iPhone應用程序中的網絡狀態?

在我viewDidLoad我稱之爲initNetworkCheck

[self initNetworkCheck]; 
[super viewDidLoad]; 
if(internetActive == NO){  
    compose.enabled = NO; 
} 

所以我要檢查在啓動時如果硬件有互聯網連接。問題是它總是讓我不知道,但當我登錄時,internetActive實際上是YES。

//[[[[[[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]; 
} 
//]]]]]] 

任何想法?

回答

1

我建議使用Apple的Reachability類。 Here是Apple的示例應用程序。

的可達性示例應用程序 演示瞭如何使用 SystemConfiguration框架 監視iPhone 或iPod touch的網絡狀態。特別地,它演示瞭如何知道何時IP可以路由並且何時業務將通過無線廣域網 網絡(WWAN)接口(例如EDGE 或3G)路由。

3

我個人使用以下命令:

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中的某個地方,這是基礎上的。

編輯:看起來像尼克發現它...... :)