可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm new to iOS development and am struggling to get the reachability.h class to work. Here is my code for view controller:
- (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); }
It looks ok but nothing is appearing in the xcode console when running the app and switching to that view.
I'm using Reachability 2.2 and iOS 4.2.
Is there something obvious that I am doing wrong?
回答1:
EDITED: If you want to check reachability before some code execution you should just use
Reachability *reachability = [Reachability reachabilityForInternetConnection]; NetworkStatus internetStatus = [reachability currentReachabilityStatus]; if (internetStatus != NotReachable) { //my web-dependent code } else { //there-is-no-connection warning }
You can also add a reachability observer somewhere (i.e. in viewDidLoad
):
Reachability *reachabilityInfo; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myReachabilityDidChangedMethod) name:kReachabilityChangedNotification object:reachabilityInfo];
Don't forget to call [[NSNotificationCenter defaultCenter] removeObserver:self];
when you no longer need reachability detection (i.e. in dealloc
method).
回答2:
Here's how I do it. I have an instance variable that I set in my init method:
_reachability = [[APReachability reachabilityForInternetConnection] retain];
and when I need to query the network status, I do:
NetworkStatus networkStatus = [_reachability currentReachabilityStatus]; if (networkStatus != NotReachable) { // Network related code } else { // No network code }
If you care about wifi, etc, network status can be:
NotReachable // No network ReachableViaWiFi // Reachable via Wifi ReachableViaWWAN // Reachable via cellular
回答3:
Update: Nov 4 2013
Using Reachability 3.0 version on iOS7
To build on top of @NR4TR and @codecaffeine's answers:
There are 5 ways to do this (not compiled :)
#include #include //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:&