1.基于AFNetworking
AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];
// 网络判断以及网络监测;
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
if (status==AFNetworkReachabilityStatusReachableViaWiFi ||status==AFNetworkReachabilityStatusReachableViaWWAN) {
NSLog(@"可以联网");
}elseif(status==AFNetworkReachabilityStatusNotReachable){
[ProgressHUD displayHudError: @"请检查网络连接"];
return ;
}else{
NSLog(@"未知网络");
}
}];
// 开启网络监测
[manager.reachabilityManagerstartMonitoring];
注:这个方法方便在是用AFNetworking ,适用性强,使用的是block; (此方法建议在请求中加入,可实时监控网络状态)2.是基于获取状态栏的信息来判断的;<这个在iphoneX上无法使用>
先创建枚举:
typedef enum : NSUInteger {
DatabaseOperationNetWorkStateNotReachable,
DatabaseOperationNetWorkStateReachableViaWWAN,
DatabaseOperationNetWorkState2G,
DatabaseOperationNetWorkState3G,
DatabaseOperationNetWorkState4G,
DatabaseOperationNetWorkStateUnknown,
} DatabaseOperationNetWorkState;
- (DatabaseOperationNetWorkState)getNetWorkStates{
UIApplication *app = [UIApplicationsharedApplication];
NSArray *children = [[[appvalueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews];
self.netWorkState =DatabaseOperationNetWorkStateUnknown;
int netType =0;
//获取到网络返回码
for (id childin children) {
if ([childisKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
//获取到状态栏
netType = [[child valueForKeyPath:@"dataNetworkType"]intValue];
switch (netType) {
case0:
self.netWorkState =DatabaseOperationNetWorkStateNotReachable;
//无网模式
break;
case1:
self.netWorkState =DatabaseOperationNetWorkState2G;
break;
case2:
self.netWorkState =DatabaseOperationNetWorkState3G;
break;
case3:
self.netWorkState =DatabaseOperationNetWorkState4G;
break;
case5:
{
self.netWorkState =DatabaseOperationNetWorkStateReachableViaWWAN;
break;
default:
self.netWorkState =DatabaseOperationNetWorkStateUnknown;
break;
}
}
}
//根据状态选择
}
if (self.netWorkState == DatabaseOperationNetWorkStateUnknown) {
self.netWorkState =DatabaseOperationNetWorkStateNotReachable;
}
returnself.netWorkState;
}
注:这个可以迅速获取网络状态,但是有一个缺点:当用的是WiFi的时候,此时如果WiFi没有网,就无法识别,(有局限性);(此方法建议在做请求前进行网络判断);
上面的方法在iphoneX上无法获取到,可以使用下面的方法,下面的方法是根据运营商获取的,所以只能获取4G/3G/2G网络,局限性太大(建议使用方法1或者方法3)
NSArray *typeStrings2G = @[CTRadioAccessTechnologyEdge,
CTRadioAccessTechnologyGPRS,
CTRadioAccessTechnologyCDMA1x];
NSArray *typeStrings3G = @[CTRadioAccessTechnologyHSDPA,
CTRadioAccessTechnologyWCDMA,
CTRadioAccessTechnologyHSUPA,
CTRadioAccessTechnologyCDMAEVDORev0,
CTRadioAccessTechnologyCDMAEVDORevA,
CTRadioAccessTechnologyCDMAEVDORevB,
CTRadioAccessTechnologyeHRPD];
NSArray *typeStrings4G = @[CTRadioAccessTechnologyLTE];
// 该 API 在 iOS7 以上系统才有效
if
([[[UIDevice currentDevice] systemVersion] floatValue] >=
7.0
) {
CTTelephonyNetworkInfo *teleInfo= [[CTTelephonyNetworkInfo alloc] init];
NSString *accessString = teleInfo.currentRadioAccessTechnology;
if
([typeStrings4G containsObject:accessString]) {
NSLog(@
"4G网络"
);
}
else
if
([typeStrings3G containsObject:accessString]) {
NSLog(@
"3G网络"
);
}
else
if
([typeStrings2G containsObject:accessString]) {
NSLog(@
"2G网络"
);
}
else
{
NSLog(@
"未知网络"
);
}
}
else
{
NSLog(@
"未知网络"
);
}
3.基于Reachability基于
添加Reachability.h和Reachability.m到工程中,导入 SystemConfiguration.framwork到工程中,
// 监听网络状态改变
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getTheNetworkStateWhenItChange) name:kReachabilityChangedNotification object:nil];
// 创建Reachability
self.reachability = [Reachability reachabilityForInternetConnection];
// 开始监控网络
[self.reachability startNotifier];
- (void)getTheNetworkStateWhenItChange
{
// 1.检测wifi状态
Reachability *wifi = [Reachability reachabilityForLocalWiFi];
// 2.检测手机是否能上网络(WIFI\2G\3G\4G)
Reachability *conn = [Reachability reachabilityForInternetConnection];
// 3.判断网络状态
if ([wifi currentReachabilityStatus] != NotReachable) {//有wifi
NSLog(@"wifi");
} elseif ([conn currentReachabilityStatus] != NotReachable) {//没有使用wifi,使用手机自带网络进行上网
NSLog(@"使用流量");
} else {//没有网络
NSLog(@"没有网络");
}
}
注:这个没用过,是在找的时候,收集过来的,
(如果觉得还可以,点个赞 ^_^ )