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(@"没有网络");
}
}
注:这个没用过,是在找的时候,收集过来的,
(如果觉得还可以,点个赞 ^_^ )
本文介绍了三种iOS设备上的网络状态检测方法:基于AFNetworking的实时监控、通过状态栏信息判断和利用Reachability类。每种方法都有其适用场景及局限性。
3663

被折叠的 条评论
为什么被折叠?



