iOS网络监测区分2、3、4G

如果有在使用AFNetworking朋友知道,在AF里只能区分当前网络是WiFi网络还是蜂窝网络在3G、4G出现以后,我们就有一个新需求,需要区分2G、3G、4G网络了,虽然同为蜂窝网络但是速度可是千差万别,有时我们会感觉到4G比WiFi还快,当然流量也是跑的相当肉痛

下面我们就来讲一讲怎么区分2G 3G 4G网络

下载Reachability

首先我们需要下载苹果官方的一个示例工程

https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html

在这个工程里有我们需要用到的 苹果官方提供的实时监测网络的类 我们是在这个基础上 稍作修改就可以做到

进入网页

1

在示例代码中 将Reachability类拷贝到我们的项目当中

2

修改Reachability

首先修改Reachability类中的网络类型枚举:

1
2
3
4
5
6
7
8
typedef enum : NSInteger {
NotReachable = 0,
ReachableViaWiFi,
ReachableViaWWAN,
kReachableVia2G,
kReachableVia3G,
kReachableVia4G
} NetworkStatus;

然后再.m文件中 找到方法

1
- (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags;

增加判断2G 3G 4G的方法
在 if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) 判断中加上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
{
returnValue = ReachableViaWWAN;

CTTelephonyNetworkInfo *phonyNetwork = [[CTTelephonyNetworkInfo alloc] init];
NSString *currentStr = phonyNetwork.currentRadioAccessTechnology;
if (currentStr) {
if ([currentStr isEqualToString:CTRadioAccessTechnologyLTE]) {
return kReachableVia4G;
}else if ([currentStr isEqualToString:CTRadioAccessTechnologyGPRS]|| [currentStr isEqualToString:CTRadioAccessTechnologyEdge]){
return kReachableVia2G;
}else{
return kReachableVia3G;
}
}

if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {
if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {
return kReachableVia2G;
}
return kReachableVia3G;
}
return ReachableViaWWAN;
}

在需要用到的地方引入我们修改过后的Reachability

使用Reachability

监听网络变化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//添加网络监测
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:)
name: kReachabilityChangedNotification
object: nil];

//开启网络监测
self.intertReach = [Reachability reachabilityForInternetConnection];
[self.intertReach startNotifier];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 300, 30)];
[self.view addSubview:label];
self.label = label;

//获取当前的网络状态
NetworkStatus status = [self.intertReach currentReachabilityStatus];
[self judgeNetWorkStatus:status];

当网络发生改变时 会触发

1
2
3
4
5
6
7
8
9
10
11
/**
当网络状态发生变换时 会触发这个方法

@param no 通知
*/
- (void)reachabilityChanged:(NSNotification *)no{
Reachability* curReach = [no object];
NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
NetworkStatus status = [curReach currentReachabilityStatus];
[self judgeNetWorkStatus:status];
}

还是很简单的

源代码 放在了

https://github.com/yangqian111/blog/tree/master/iOS网络区分2、3、4G