使用Reachability类判断iOS设备的当前网络连接类型


(1). 下载 https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip

(2). 拖reachability.h,reachability.m入工程 (库非ARC)

ARC:-fno-objc-arc              

(3) .导入SystemConfiguration.framework

(4).用法

-(NSString*)getNetType   {          NSString* result;          Reachability *r = [Reachability reachabilityWithHostName:@"www.baidu.com"];     NSLog(@"  ====:%i",[r currentReachabilityStatus]);     switch ([r currentReachabilityStatus]) {                      case NotReachable:// 没有网络连接                                       result=@"没有网络连接";                          break;                      case ReachableViaWWAN:// 使用3G网络                          result=@"3g";                          break;                      case ReachableViaWiFi:// 使用WiFi网络                          result=@"wifi";                          break;                  }     NSLog(@"caseReachableViaWWAN=%i",ReachableViaWWAN);     NSLog(@"caseReachableViaWiFi=%i",ReachableViaWiFi);     return result;      }

(5)如果无法区分出2G、2.5G、3G网络的区别,那么我们可以将Reachability.m中的networkStatusForFlags方法重构:


- (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)

    {

        if((flags & kSCNetworkReachabilityFlagsReachable) == kSCNetworkReachabilityFlagsReachable) {

            if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {

                retVal = ReachableVia3G;

                if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {

                    retVal = ReachableVia2G;

                }

            }

        }

    }

    return retVal;

}

 

//检查当前网络连接是否正常

-(BOOL)connectedToNetWork

{

    struct sockaddr_in zeroAddress;

    bzero(&zeroAddress, sizeof(zeroAddress));

    zeroAddress.sin_len = sizeof(zeroAddress);

    zeroAddress.sin_family = AF_INET;

     

    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);

    SCNetworkReachabilityFlags flags;

     

    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);

    CFRelease(defaultRouteReachability);

     

    if (!didRetrieveFlags) {

        printf("Error. Count not recover network reachability flags\n");

        return NO;

    }

     

    BOOL isReachable = flags & kSCNetworkFlagsReachable;

    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;

    return (isReachable && !needsConnection) ? YES : NO;

}

 

//检查网络连接类型

-(void)checkNetworktype:(id)sender{

    NSString *connectionKind;

    if ([self connectedToNetWork]) {

        hostReach = [Reachability reachabilityWithHostName:@"www.google.com"];

        switch ([hostReach currentReachabilityStatus]) {

            case NotReachable:

                connectionKind = @"没有网络链接";

                break;

            case ReachableViaWiFi:

                connectionKind = @"当前使用的网络类型是WIFI";

                break;

            case ReachableVia3G:

                connectionKind = @"当前使用的网络链接类型是WWAN(3G)";

                break;

            case ReachableVia2G:

                connectionKind = @"当前使用的网络链接类型是WWAN(2G)";

                break;    

            default:

                break;

        }

    }else {

        connectionKind = @"没有网络链接";

    }

}

声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。