iOS-关于获取当前网络是属于2G还是3G


中国的iphone网络是区分2G3G,要想获取当前的网络状态一直没有一个好的方法,网上给的例子也不尽让人满意最近闲来无事,仔细的研究Apple提供的例子:Reachability

通过如下的代码:

static NSString *reachabilityFlags_(SCNetworkReachabilityFlags flags) {

    

    

#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 30000) // Apple advises you to use the magic number instead of a symbol.

    

    return [NSString stringWithFormat:@"Reachability Flags: %c%c %c%c%c%c%c%c%c",

            

            (flags & kSCNetworkReachabilityFlagsIsWWAN)               ? 'W' : '-',

            

            (flags & kSCNetworkReachabilityFlagsReachable)            ? 'R' : '-',

            

            

            (flags & kSCNetworkReachabilityFlagsConnectionRequired)   ? 'c' : '-',

            

            (flags & kSCNetworkReachabilityFlagsTransientConnection)  ? 't' : '-',

            

            (flags & kSCNetworkReachabilityFlagsInterventionRequired) ? 'i' : '-',

            

            (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic)  ? 'C' : '-',

            

            (flags & kSCNetworkReachabilityFlagsConnectionOnDemand)   ? 'D' : '-',

            

            (flags & kSCNetworkReachabilityFlagsIsLocalAddress)       ? 'l' : '-',

            

            (flags & kSCNetworkReachabilityFlagsIsDirect)             ? 'd' : '-'];

    

#else

    

    // Compile out the v3.0 features for v2.2.1 deployment.

    

    return [NSString stringWithFormat:@"Reachability Flags: %c%c %c%c%c%c%c%c",

            

            (flags & kSCNetworkReachabilityFlagsIsWWAN)               ? 'W' : '-',

            

            (flags & kSCNetworkReachabilityFlagsReachable)            ? 'R' : '-',

            

            

            (flags & kSCNetworkReachabilityFlagsConnectionRequired)   ? 'c' : '-',

            

            (flags & kSCNetworkReachabilityFlagsTransientConnection)  ? 't' : '-',

            

            (flags & kSCNetworkReachabilityFlagsInterventionRequired) ? 'i' : '-',

            

            // v3 kSCNetworkReachabilityFlagsConnectionOnTraffic == v2 kSCNetworkReachabilityFlagsConnectionAutomatic

            

            (flags & kSCNetworkReachabilityFlagsConnectionAutomatic)  ? 'C' : '-',

            

            // (flags & kSCNetworkReachabilityFlagsConnectionOnDemand)   ? 'D' : '-', // No v2 equivalent.

            

            (flags & kSCNetworkReachabilityFlagsIsLocalAddress)       ? 'l' : '-',

            

            (flags & kSCNetworkReachabilityFlagsIsDirect)             ? 'd' : '-'];

    

#endif

    

    

} // reachabilityFlags_()


当是wifi的时候输出R

当是3G的时候输出Rt

当是联通2G或者是移动的时候输出Rtc

在头文件定义如下:


typedef enum

{

    NotReachable = 0,

    ReachableViaWiFi,

    ReachableVia3G,

    ReachableVia2G,//当前无法区分是联通的2G还是移动的2G

} NetworkStatus;


因此我就是以这个为判断条件的,重写Reachability的函数:

- (NetworkStatus) networkStatusForFlags: (SCNetworkReachabilityFlags) flags

{

    if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)

    {

        return NotReachable;

    }

    BOOL retVal = NotReachable;

    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

        retVal = ReachableViaWiFi;

    }

    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 

            retVal = ReachableViaWiFi; 

        } 

    }

    if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) 

    { 

        retVal = ReachableVia3G;

        if((flags & kSCNetworkReachabilityFlagsReachable) == kSCNetworkReachabilityFlagsReachable) 

        { 

            if((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection)

            { 

                retVal = ReachableVia2G;

            } 

        } 

    }

    return retVal;

}

这样就可以正确的区分是2G3Gwifi网络,这只支持中国地区,其他地区未考虑。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值