使用iOS SDK检查Internet连接

使用iOS SDK检查Internet连接的最佳方法是什么?

最好的方法是使用Reachability代码。 在这里检查苹果示例代码 。 这有很多方便的方法来检查互联网的可用性,WiFi / WAN连接检查等。

例如: –

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChanged:) name:kReachabilityChangedNotification object:nil]; reachability = [Reachability reachabilityForInternetConnection]; [reachability startNotifier]; - (void)networkChanged:(NSNotification *)notification { NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus]; if(remoteHostStatus == NotReachable) { NSLog(@"not reachable");} else if (remoteHostStatus == ReachableViaWiFiNetwork) { NSLog(@"wifi"); } else if (remoteHostStatus == ReachableViaCarrierDataNetwork) { NSLog(@"carrier"); } } 

可达性比它所需要的要多得多,加上它还没有被更新为ARC。

这里是我在纯C中的解决scheme。大部分代码是直接从Reachability中获取的,但是只被提取到了必需的部分。 我只希望它返回是否有互联网连接,但是您可以从注释中读取是否基于findWifi或蜂窝networking返回YES。

在继续共享代码之前最后一个注意事项:您需要进入构build目标,select构build阶段选项卡,并将“SystemConfiguration.framework”添加到“Link Binary With Libraries”列表中。

 #import <CoreFoundation/CoreFoundation.h> #import <SystemConfiguration/SystemConfiguration.h> #import <netdb.h> BOOL networkReachable() { struct sockaddr_in zeroAddress; bzero(&zeroAddress, sizeof(zeroAddress)); zeroAddress.sin_len = sizeof(zeroAddress); zeroAddress.sin_family = AF_INET; SCNetworkReachabilityRef reachabilityRef = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *) &zeroAddress); SCNetworkReachabilityFlags flags; if (SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) { if ((flags & kSCNetworkReachabilityFlagsReachable) == 0) { // if target host is not reachable return NO; } if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0) { // if target host is reachable and no connection is required // then we'll assume (for now) that your on Wi-Fi return YES; // This is a wifi connection. } if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)) { // ... and the connection is on-demand (or on-traffic) if the // calling application is using the CFSocketStream or higher APIs if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0) { // ... and no [user] intervention is needed return YES; // This is a wifi connection. } } if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) { // ... but WWAN connections are OK if the calling application // is using the CFNetwork (CFSocketStream?) APIs. return YES; // This is a cellular connection. } } return NO; } 

试试这个代码:

 - (BOOL)connectedToInternet { NSURL *url=[NSURL URLWithString:@"http://www.google.com"]; NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"HEAD"]; NSHTTPURLResponse *response; [NSURLConnection sendSynchronousRequest:request returningResponse:&response error: NULL]; return ([response statusCode]==200)?YES:NO; }