iOS平台判断2G,3G,wifi网络类型

http://stackoverflow.com/questions/16774885/objective-c-determine-data-network-type-of-the-ios-device

相信大家都有过类似的需求,需要判断iOS上面当前连接的网络是2G,3G还是wifi?大部分的做法是使用reachability这个类,但是这种做法有一个致命的缺点就是:无法区分2G和3G。虽然网上号称有人可以准确的区分开,但是我自己测试,发现并非如此。而且reachability这种做法,需要连接到指定的一个网站,然后采用通知的方式来获取连接的状态,由此可见这种做法,既慢又复杂。下面就介绍一种简单而又准确的方法。


首先定义一个枚举来代表不同的网络类型


typedef enum {

   NETWORK_TYPE_NONE= 0,

   NETWORK_TYPE_WIFI= 1,

   NETWORK_TYPE_3G= 2,

   NETWORK_TYPE_2G= 3,

}NETWORK_TYPE;


然后通过获取手机信号栏上面的网络类型的标志

+ (int)dataNetworkTypeFromStatusBar {


   UIApplication *app = [UIApplicationsharedApplication];

   NSArray *subviews = [[[app valueForKey:@"statusBar"valueForKey:@"foregroundView"subviews];

   NSNumber *dataNetworkItemView = nil;


   for (id subview in subviews) {

       if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView"class]]) {

           dataNetworkItemView = subview;

           break;

       }

   }


int netType = NETWORK_TYPE_NONE;

NSNumber * num = [dataNetworkItemView valueForKey:@"dataNetworkType"];

if (num == nil) {


       netType = NETWORK_TYPE_NONE;


   }else{


int n = [num intValue];

if (n == 0) {

           netType = NETWORK_TYPE_NONE;

       }elseif (n == 1){

           netType = NETWORK_TYPE_2G;

       }elseif (n == 2){

           netType = NETWORK_TYPE_3G;

       }else{

           netType = NETWORK_TYPE_WIFI;

       }


   }


return netType;

}


注意:这里用到了私有的API,但是这个大家不用担心,因为我的应用已经被审核通过了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值