iOS使用Reachability检测2G、3G、4G网络
2016-05-25 本文已影响3437人
北海有鱼w
我们常常会碰到这样的需求,在2G网络状态下不下载高清图片,只查看文字,在wifi、3G、4G可以下载高清图片,以达到提升用户体验的目的。最近在自己的项目里面也有类似的需求,查找资料,稍微修改了苹果官方的Reachability实时监测网络状态变化。
- 这里是Reachability下载地址点击这里下载
1、不废话,直接上干货
在Reachability.m
文件中导入CoreTelephony库
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
找到此方法if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
修改,对了 ,先修改枚举值在Reachability.h
中
typedef enum : NSInteger {
NotReachable = 0,
ReachableViaWiFi,
ReachableViaWWAN,
kRaeachableVia4G,
kReachableVia2G,
kReachableVia3G
} NetworkStatus;
增加代码
if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
{
/*
... but WWAN connections are OK if the calling application is using the CFNetwork APIs.
*/
returnValue = ReachableViaWWAN;
if (IOS_VERSION >= 7.0) {
CTTelephonyNetworkInfo *phonyNetwork = [[CTTelephonyNetworkInfo alloc] init];
NSString *currentStr = phonyNetwork.currentRadioAccessTechnology;
if (currentStr) {
if ([currentStr isEqualToString:CTRadioAccessTechnologyLTE]) {
return kRaeachableVia4G;
}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;
}
2、在需要的地方引入#import "Reachability.h"
监听网络状态变化通知
- (void)viewDidLoad {
[super viewDidLoad];
// 监测网络情况
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:)
name: kReachabilityChangedNotification
object: nil];
NSString *remoteHostName = @"www.apple.com";
NSString *remoteHostLabelFormatString = NSLocalizedString(@"Remote Host: %@", @"Remote host label format string");
UILabel *remoteHostLabel = [[UILabel alloc] init];
remoteHostLabel.text = [NSString stringWithFormat:remoteHostLabelFormatString, remoteHostName];
self.hostReachability = [Reachability reachabilityWithHostName:remoteHostName];
[self.hostReachability startNotifier];
}
3、记得在delloc里面销毁通知
- (void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
4、处理通知方法
- (void)reachabilityChanged:(NSNotification *)no{
Reachability* curReach = [no object];
NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
NetworkStatus status = [curReach currentReachabilityStatus];
switch (status)
{
case NotReachable:
NSLog(@"====当前网络状态不可达=======");
//其他处理
self.kReachableVia = @"当前网络状态不可达";
break;
case ReachableViaWiFi:
NSLog(@"====当前网络状态为Wifi=======");
self.kReachableVia = @"ReachableViaWiFi";
//其他处理
break;
case kReachableVia2G:
NSLog(@"====当前网络状态为2G=======");
self.kReachableVia = @"kReachableVia2G";
break;
case kReachableVia3G:
NSLog(@"====当前网络状态为3G=======");
//其他处理
self.kReachableVia = @"kReachableVia3G";
break;
case kRaeachableVia4G:
NSLog(@"====当前网络状态为4G=======");
self.kReachableVia = @"kRaeachableVia4G";
//其他处理
break;
default:
NSLog(@"你是外星来的吗?");
//其他处理
self.kReachableVia = @"你是外星来的吗?";
break;
}
}
结束语:网络监听状态就到这里了,还是挺简单的,make一下,也希望能帮助到需要的人。