如何使用可达性类来检测有效的Internet连接?

我是iOS开发新手,正努力让reachability.h类工作。 这是我的视图控制器的代码:

- (void)viewWillAppear:(BOOL)animated { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil]; internetReachable = [Reachability reachabilityForInternetConnection]; [internetReachable startNotifier]; } - (void)checkNetworkStatus:(NSNotification *)notice { NetworkStatus internetStatus = [internetReachable currentReachabilityStatus]; NSLog(@"Network status: %i", internetStatus); } 

它看起来不错,但在运行应用程序并切换到该视图时,xcode控制台中没有任何显示。

我正在使用Reachability 2.2和iOS 4.2。

有什么明显的,我做错了吗?

编辑:如果你想检查一些代码执行之前的可达性,你应该只使用

 Reachability *reachability = [Reachability reachabilityForInternetConnection]; NetworkStatus internetStatus = [reachability currentReachabilityStatus]; if (internetStatus != NotReachable) { //my web-dependent code } else { //there-is-no-connection warning } 

您还可以在某处添加可达性观察者(即在viewDidLoad ):

 Reachability *reachabilityInfo; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myReachabilityDidChangedMethod) name:kReachabilityChangedNotification object:reachabilityInfo]; 

不要忘记调用[[NSNotificationCenter defaultCenter] removeObserver:self]; 当你不再需要可达性检测(即dealloc方法)。

这是我怎么做的。 我有一个实例variables,我在我的init方法中设置:

 _reachability = [[APReachability reachabilityForInternetConnection] retain]; 

当我需要查询networking状态时,我会这样做:

 NetworkStatus networkStatus = [_reachability currentReachabilityStatus]; if (networkStatus != NotReachable) { // Network related code } else { // No network code } 

如果你关心无线networking等,networking状态可以是:

  NotReachable // No network ReachableViaWiFi // Reachable via Wifi ReachableViaWWAN // Reachable via cellular 

更新:2013年11月4日

在iOS7上使用Reachability 3.0版本

build立@ NR4TR和@ codecaffeine的答案:

有5种方式来做到这一点(不编译:)

 #include <ifaddrs.h> #include <arpa/inet.h> //1 - Is www.apple.com reachable? Reachability *rHostName = [Reachability reachabilityWithHostName:@"www.apple.com"]; NetworkStatus s1 = [rHostName currentReachabilityStatus]; //2 - Is local wifi router or access point reachable? Reachability *rLocalWiFi = [Reachability reachabilityForLocalWiFi]; NetworkStatus s2 = [rLocalWiFi currentReachabilityStatus]; //3 - Is my access point connected to a router and the router connected to the internet? Reachability *rConnection = [Reachability reachabilityForInternetConnection]; NetworkStatus s3 = [rConnection currentReachabilityStatus]; //4 IPv4 standard addresses checking instead of host to avoid dns lookup step struct sockaddr_in saIPv4; inet_pton(AF_INET, "74.125.239.51", &(saIPv4.sin_addr)); saIPv4.sin_len = sizeof(saIPv4); saIPv4.sin_family = AF_INET; Reachability *rIPv4 = [Reachability reachabilityWithAddress:&saIPv4]; NetworkStatus s4 = [rIPv4 currentReachabilityStatus]; //5 IPv6 addresses checking instead of host to avoid dns lookup step struct sockaddr_in saIPv6; inet_pton(AF_INET, "2607:f8b0:4010:801::1014", &(saIPv6.sin_addr)); saIPv6.sin_len = sizeof(saIPv6); saIPv6.sin_family = AF_INET; Reachability *rIPv6 = [Reachability reachabilityWithAddress:&saIPv6]; NetworkStatus s5 = [rIPv6 currentReachabilityStatus]; 

处理状态是一样的

 if (ReachableViaWiFi == s1) return @"WiFi"; //@"WLAN" if (ReachableViaWWAN == s1) return @"Cellular"; //@"WWAN" return @"None"; 

按照这个链接,它有非常有用的源代码和步骤https://github.com/tonymillion/Reachability 。 这为您提供了有关如何在Reachability中使用不同方法的信息。

添加system.configuration.framewok,并将Reachability.m和Reachability.h文件添加到您的项目中。 有使用方法之后

 +(instancetype)reachabilityWithHostName:(NSString*)hostname; +(instancetype)reachabilityForInternetConnection; +(instancetype)reachabilityWithAddress:(void *)hostAddress; +(instancetype)reachabilityForLocalWiFi; 

示例代码片段:

 - (void)CheckConnection { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil]; Reachability * reach = [Reachability reachabilityWithHostname:@"www.google.com"]; reach.reachableBlock = ^(Reachability * reachability) { dispatch_async(dispatch_get_main_queue(), ^{ _blockLabel.stringValue = @"Block Says Reachable"; }); }; reach.unreachableBlock = ^(Reachability * reachability) { dispatch_async(dispatch_get_main_queue(), ^{ _blockLabel.stringValue = @"Block Says Unreachable"; }); }; [reach startNotifier]; } 

希望这可以帮助

只需导入可达性类即可

 -(BOOL) connectedToNetwork { const char *host_name = "www.google.com"; BOOL _isDataSourceAvailable = NO; Boolean success; SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL,host_name); SCNetworkReachabilityFlags flags; success = SCNetworkReachabilityGetFlags(reachability, &flags); _isDataSourceAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); CFRelease(reachability); return _isDataSourceAvailable; } 

请参阅下面的代码来检查Internet Connectivity

 struct sockaddr_in zeroAddress; bzero(&zeroAddress, sizeof(zeroAddress)); zeroAddress.sin_len = sizeof(zeroAddress); zeroAddress.sin_family = AF_INET; // Recover reachability flags SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr*)&zeroAddress); SCNetworkReachabilityFlags flags; BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags); CFRelease(defaultRouteReachability); if (!didRetrieveFlags) { return 0; } BOOL isReachable = flags & kSCNetworkFlagsReachable; BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired; BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection; NSURL *testURL = [NSURL URLWithString:@"http://www.google.com/"]; NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0]; NSURLResponse *response = nil; NSError *error = nil; NSData *connectiondata = [NSURLConnection sendSynchronousRequest:testRequest returningResponse:&response BOOL connection=NO; if ([connectiondata length] > 0 && error == nil){ NSLog(@"Connection present” ); connection=YES; } else { NSLog(@"No Connection" ); connection=NO; } return ((isReachable && !needsConnection) || nonWiFi) ? (connection ? YES : NO) : NO; 

最简单的方法(一旦你已经添加到您的项目可达性 ):

 Reachability *reachability = [Reachability reachabilityForInternetConnection]; if (reachability.isReachable) { NSLog(@"We have internet!"); } else { NSLog(@"No internet!"); }