2011-04-14 191 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中的某个地方,这是基础上的。

编辑:看起来像尼克发现它...... :)