检测网络状态(*)

时间:2023-01-28 17:03:22

检查网络 转自*原文连接http://*.com/questions/1083701/how-to-check-for-an-active-internet-connection-on-iphone-sdk

METHOD 1: Use a simple (ARC and GCD compatible) class to do it

//方法一用ARC和GCD来做

1) Add SystemConfiguration framework to the project but don't worry about including it anywhere

//在工程中添加SystemConfiguration库

2) Add Tony Million's version of Reachability.h and Reachability.m to the project (found here: https://github.com/tonymillion/Reachability)

//把Reachability.h和Reachability.m文件添加进来(可以从github连接上下载)

3) Update the interface section

//修改头文件

#import "Reachability.h"

// Add this to the interface in the .m file of your view controller
@interface MyViewController ()
{
Reachability *internetReachableFoo;
}
@end

4) Then implement this method in the .m file of your view controller which you can call

//修改实现文件,(别用google了 用百度吧.)

// Checks if we have an internet connection or not
- (void)testInternetConnection
{
internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];

// Internet is reachable
internetReachableFoo.reachableBlock = ^(Reachability*reach)
{
// Update the UI on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Yayyy, we have the interwebs!");
});
};

// Internet is not reachable
internetReachableFoo.unreachableBlock = ^(Reachability*reach)
{
// Update the UI on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Someone broke the internet :(");
});
};

[internetReachableFoo startNotifier];
}

METHOD 2: Do it yourself the old way using Apple's outdated Reachability class

//用苹果原来的Reachability类来实现

1) Add SystemConfiguration framework to the project but don't worry about including it anywhere

//添加SystemConfiguration库

2) Add Apple's version of Reachability.h and Reachability.m to the project (you can get those here)

//把Reachability.h和Reachability.m文件添加进来

3) Add @class
Reachability;
 to the .h file of where you are implementing the code

//在你要实现代码的.h文件声明@class Reachability;

4) Create a couple instances to check in the interface section of the .h file:

//在.h中实现两个属性

Reachability* internetReachable;
Reachability* hostReachable;

5) Add a method in the .h for when the network status updates:

//.h添加方法

-(void) checkNetworkStatus:(NSNotification *)notice;

6) Add #import
"Reachability.h"
 to the .m file where you are implementing the check

//在实现文件导入头文件

7) In the .m file of where you are implementing the check, you can place this in one of the first methods called (init or viewWillAppear or viewDidLoad etc):

//在实现文件实现检测网络的方法,第一次检测可以放在(init or viewWillAppear or viewDidLoad )方法里

-(void) viewWillAppear:(BOOL)animated
{
// check for internet connection
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];

internetReachable = [Reachability reachabilityForInternetConnection];
[internetReachable startNotifier];

// check if a pathway to a random host exists
hostReachable = [Reachability reachabilityWithHostName:@"www.apple.com"];
[hostReachable startNotifier];

// now patiently wait for the notification
}

8) Set up the method for when the notification gets sent and set whatever checks or call whatever methods you may have set up (in my case, I just set a BOOL)

//实现通知执行的方法当收到通知的时候会执行该方法,可以用一个bool值来判断网络状态

-(void) checkNetworkStatus:(NSNotification *)notice
{
// called after network status changes
NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
switch (internetStatus)
{
case NotReachable:
{
NSLog(@"The internet is down.");
self.internetActive = NO;

break;
}
case ReachableViaWiFi:
{
NSLog(@"The internet is working via WIFI.");
self.internetActive = YES;

break;
}
case ReachableViaWWAN:
{
NSLog(@"The internet is working via WWAN.");
self.internetActive = YES;

break;
}
}

NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
switch (hostStatus)
{
case NotReachable:
{
NSLog(@"A gateway to the host server is down.");
self.hostActive = NO;

break;
}
case ReachableViaWiFi:
{
NSLog(@"A gateway to the host server is working via WIFI.");
self.hostActive = YES;

break;
}
case ReachableViaWWAN:
{
NSLog(@"A gateway to the host server is working via WWAN.");
self.hostActive = YES;

break;
}
}
}

9) In your dealloc or viewWillDisappear or similar method, remove yourself as an observer

//在dealloc or viewWillDisappear中销毁通知

-(void) viewWillDisappear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}

Note: There might be an instance using viewWillDisappear where you receive a memory warning and the observer never gets unregistered so you should account for that as well.


Note: The domain you use doesn't matter. It's just testing for a gateway to any domain.

Important Note: The Reachability class is one of the most used classes in projects so you might run into naming conflicts with other projects like ShareKit. If this happens, you'll have to rename one of the pairs of Reachability.h and Reachability.m files to something else to resolve the issue.//Reachability类是比较常用的类,如果饮用了别的库,发现重名冲突,你可以把类文件的名字改了,或者找一些其他方法解决这个问题.