iOS判断网络状态的方法有很多种,以下三种相对最常用:
(1)AFN,如果项目的网络请求用到了AFN框架,AFN种有一个AFNetworkReachabilityManager 单例类可以取到当前的网络状态,方便实用。
#pragma 网络状态监控 - (void)checkNetworkStatus { AFNetworkReachabilityManager* manager = [AFNetworkReachabilityManager sharedManager]; [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { NSLog(@"%@",AFStringFromNetworkReachabilityStatus(status)); switch (status) { case AFNetworkReachabilityStatusReachableViaWiFi: //lab.text = @"当前网络连接:wifi"; break; case AFNetworkReachabilityStatusReachableViaWWAN: //lab.text = @"当前网络连接:2G/3G/4G"; break; case AFNetworkReachabilityStatusNotReachable: default: //lab.text = @"当前网络连接:未连接"; break; } }]; [manager startMonitoring]; }
(2)Apple官方给了 Reachability 文档,用来获取、检测设备的网络状态。
只需要导入Reachability.h 和 Reachability.m 文件,然后导入SystemConfiguration.framework框架就可以实用了,苹果官方给的方法,比较权威,绝对没问题。
// 监听网络状态改变的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kReachabilityChangedNotification object:nil]; // 创建Reachability self.conn = [Reachability reachabilityForInternetConnection]; // 开始监控网络(一旦网络状态发生改变, 就会发出通知kReachabilityChangedNotification) [self.conn startNotifier]; // 处理网络状态改变 - (void)networkStateChange { // 1.检测wifi状态 Reachability *wifi = [Reachability reachabilityForLocalWiFi]; // 2.检测手机是否能上网 Reachability *conn = [Reachability reachabilityForInternetConnection]; // 3.判断网络状态 if ([wifi currentReachabilityStatus] != NotReachable) { // 有wifi NSLog(@"有wifi"); } else if ([conn currentReachabilityStatus] != NotReachable) { // 没有使用wifi, 使用手机自带网络进行上网 NSLog(@"使用手机自带网络进行上网"); } else { // 没有网络 NSLog(@"没有网络"); } }
(3)根据设备状态栏种网络状态获取
- (NSString *)getNetWorkStates{ UIApplication *app = [UIApplication sharedApplication]; NSArray *children = [[[app valueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews]; NSString *state = [[NSString alloc]init]; int netType = 0; //获取到网络返回码 for (id child in children) { if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) { //获取到状态栏 netType = [[child valueForKeyPath:@"dataNetworkType"]intValue]; switch (netType) { case 0: state = @"无网络"; //无网模式 break; case 1: state = @"2G"; break; case 2: state = @"3G"; break; case 3: state = @"4G"; break; case 5: { state = @"wifi"; break; default: break; } } } //根据状态选择 } return state; }