开发中经常会遇到检测网络状态情况,现在说一下ios中如何获取网络状态,以及监听网络状态变化。
首先下载Reachability文件,将Reachability.h和Reachability.m文件导入工程中。由于Reachability.h文件导入了
#import <SystemConfiguration/SystemConfiguration.h>
,所以工程中需要添加SystemConfiguration.framwork。
获取网络状态
NSString *hostName = @"www.baidu.com";
Reachability *reachability = [Reachability reachabilityWithHostName:hostName];
switch ([reachability currentReachabilityStatus]) {
case NotReachable:
//不能访问
break;
case ReachableViaWiFi:
//使用wifi
break;
case ReachableViaWWAN:
//使用3/4G网络
break;
default:
break;
}
上述只能判断是否能访问该网址,即使网络处于连接状态,但只要该应用无法访问指定站点(可能因为站点不存在),也会返回NotReachable。可以用下面的方法。
/** 检测 wifi 状态 */
- (BOOL) checkWifiState {
Reachability *wifi = [Reachability reachabilityForLocalWiFi];
return [wifi currentReachabilityStatus] != NotReachable; // 有wifi
}
/** 检测蜂窝移动数据状态 */
- (BOOL) checkCellularState {
Reachability *conn = [Reachability reachabilityForInternetConnection];
return [conn currentReachabilityStatus] != NotReachable;
}
监听网络状态改变
//通知中心监听kReachabilityChangedNotification通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChange:) name:kReachabilityChangedNotification object:nil];
//获取Reachability对象
Reachability *reach = [Reachability reachabilityWithHostName:@"www.baidu.com"];
//让Reachability对象开启监听
[reach startNotifier];
回调
-(void)networkChange:(NSNotification *)noti{
//获取被监听的Reachability对象
Reachability *reachability = [noti object];
//获取网络状态。
NetworkStatus status = [reachability currentReachabilityStatus];
//....
}
关闭监听
[reach stopNotifier];