如何检查iPhone应用程序中的网络状态?
问题描述:
我已经设置了一些方法来检查我的应用中的网络状态。如何检查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];
}
//]]]]]]
任何想法?
答
我建议使用Apple的Reachability类。 Here是Apple的示例应用程序。
的可达性示例应用程序 演示了如何使用 SystemConfiguration框架 监视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中的某个地方,这是基础上的。
编辑:看起来像尼克发现它...... :)