Reachability.m 中 networkStatusForFlags 方法重构

本文介绍了一个iOS应用中用于检测网络状态的方法,通过Reachability类实现网络连接状态的判断及网络类型的区分,包括不可达、Wi-Fi、3G及2G等不同情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//Reachability.m 中 networkStatusForFlags 方法重构
- (NetworkStatus) networkStatusForFlags: (SCNetworkReachabilityFlags) flags
{
    if((flags & kSCNetworkReachabilityFlagsReachable) == 0)
    {
        returnNotReachable;
    }
     
    BOOLretVal = 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;
                }
            }
        }
    }
    returnretVal;
}
 
//检查当前网络连接是否正常
-(BOOL)connectedToNetWork
{
    structsockaddr_in zeroAddress;
    bzero(&zeroAddress,sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;
     
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (structsockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;
     
    BOOLdidRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);
     
    if(!didRetrieveFlags) {
        printf("Error. Count not recover network reachability flags\n");
        returnNO;
    }
     
    BOOLisReachable = flags & kSCNetworkFlagsReachable;
    BOOLneedsConnection = flags & kSCNetworkFlagsConnectionRequired;
    return(isReachable && !needsConnection) ? YES: NO;
}
 
//检查网络连接类型
-(void)checkNetworktype:(id)sender{
    NSString*connectionKind;
    if([selfconnectedToNetWork]) {
        hostReach = [Reachability reachabilityWithHostName:@"www.google.com"];
        switch([hostReach currentReachabilityStatus]) {
            caseNotReachable:
                connectionKind = @"没有网络链接";
                break;
            caseReachableViaWiFi:
                connectionKind = @"当前使用的网络类型是WIFI";
                break;
            caseReachableVia3G:
                connectionKind = @"当前使用的网络链接类型是WWAN(3G)";
                break;
            caseReachableVia2G:
                connectionKind = @"当前使用的网络链接类型是WWAN(2G)";
                break;    
            default:
                break;
        }
    }else{
        connectionKind = @"没有网络链接";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值