直接貼代碼吧,ios7之后是獲取的較為准確,7以下我拿iphone5測試的是無法區分3g/2g。連iphone4都能升到7.1.4,而且目前主流的設備7以下的系統已經很少了,這個方案盡管不太完美,但影響不會太大
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
string GetNetWorkType()
{
string strNetworkType = "";
//創建零地址,0.0.0.0的地址表示查詢本機的網絡連接狀態
struct sockaddr_storage zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.ss_len = sizeof(zeroAddress);
zeroAddress.ss_family = AF_INET;
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
//獲得連接的標志
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
//如果不能獲取連接標志,則不能連接網絡,直接返回
if (!didRetrieveFlags)
{
return strNetworkType;
}
if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
{
// if target host is reachable and no connection is required
// then we'll assume (for now) that your on Wi-Fi
strNetworkType = "WIFI";
}
if (
((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0
)
{
// ... and the connection is on-demand (or on-traffic) if the
// calling application is using the CFSocketStream or higher APIs
if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
{
// ... and no [user] intervention is needed
strNetworkType = "WIFI";
}
}
if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
{
CTTelephonyNetworkInfo * info = [[CTTelephonyNetworkInfo alloc] init];
NSString *currentRadioAccessTechnology = info.currentRadioAccessTechnology;
if (currentRadioAccessTechnology)
{
if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE])
{
strNetworkType = "4G";
}
else if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge] || [currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS])
{
strNetworkType = "2G";
}
else
{
strNetworkType = "3G";
}
}
}
else
{
if((flags & kSCNetworkReachabilityFlagsReachable) == kSCNetworkReachabilityFlagsReachable)
{
if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection)
{
if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired)
{
strNetworkType = "2G";
}
else
{
strNetworkType = "3G";
}
}
}
}
}
if (strNetworkType == "") {
strNetworkType = "WWAN";
}
NSLog( @"GetNetWorkType() strNetworkType : %s", strNetworkType.c_str());
return strNetworkType;
}
參考鏈接:
http://blog.csdn.net/justinjing0612/article/details/8741261