您的位置:首页 > 理论基础 > 计算机网络

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

2014-07-24 09:42 471 查看
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,但是这个大家不用担心,因为我的应用已经被审核通过了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: