Apple的Reachability Sample看起来不错,但是只可以判断是否连接到互联网和是否连接Wifi,但是无法判断运营商网络类型(2G/3G等)。
第一种方法就是尝试从状态栏中获取网络类型,代码如下:【私有API】
- +(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;
- }
第二种方法是通过SoftwareUpdateServices.framework中的SUNetworkMonitor类型来获取,参考SO链接。同样也是私有API。
第三种方法是iOS 7中的公有API,在CTTelephonyNetworkInfo类型中,官方文档相关API的说明 https://developer.apple.com/library/ios/documentation/NetworkingInternet/Reference/CTTelephonyNetworkInfo/index.html
实现起来就是使用CTTelephonyNetworkInfo类型的currentRadioAccessTechnology方法,代码如下:
- #import <CoreTelephony/CTTelephonyNetworkInfo.h>
- @property (strong, nonatomic)CTTelephonyNetworkInfo *networkInfo;
- self.networkInfo = [[CTTelephonyNetworkInfo alloc] init];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChanged) name:CTRadioAccessTechnologyDidChangeNotification object:nil];
- - (void)networkChanged{
- //网络改变,做相关的操作,注意非UI线程
- dispatch_async(dispatch_get_main_queue(), ^{
- self.networkLabel.text = state;
- });
- }