IOS判斷用戶的網絡類型(2/3/4G、wifi)


直接貼代碼吧,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

http://www.jianshu.com/p/efcfa3c87306

http://www.cnblogs.com/xiaohuzi1990/p/4341655.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM