Iphone 当Wi-Fi和蜂窝网络都打开时,蜂窝网络的可达性返回False

Iphone 当Wi-Fi和蜂窝网络都打开时,蜂窝网络的可达性返回False,iphone,objective-c,ios,ios5,reachability,Iphone,Objective C,Ios,Ios5,Reachability,我正在使用,以确定是否存在Internet连接 现在我发现,当我同时打开手机和WIFI时,我的手机检查显示为假,而WIFI检查显示为真 我已尝试为此修改NetworkStatus返回值。。但是没有成功 有人能帮我解决这个问题吗 我想要的是,当两个网络都打开时,我的可达性应该对这两个网络都是真实的 谁能帮助我理解以下几点: SCNetworkReachabilityGetFlags(reachabilityRef,&flags)会做什么 如何仅检查以下代码中的networkStatusForFla

我正在使用,以确定是否存在Internet连接

现在我发现,当我同时打开手机和WIFI时,我的手机检查显示为假,而WIFI检查显示为真

我已尝试为此修改NetworkStatus返回值。。但是没有成功

有人能帮我解决这个问题吗

我想要的是,当两个网络都打开时,我的可达性应该对这两个网络都是真实的

谁能帮助我理解以下几点:

  • SCNetworkReachabilityGetFlags(reachabilityRef,&flags)
    会做什么

  • 如何仅检查以下代码中的
    networkStatusForFlags

    - (NetworkStatus) currentReachabilityStatus
    {
    NSAssert(reachabilityRef != NULL, @"currentNetworkStatus called with NULL reachabilityRef");
    NetworkStatus retVal = NotReachable;
    SCNetworkReachabilityFlags flags;
    if (SCNetworkReachabilityGetFlags(reachabilityRef, &flags))
    {
        if(localWiFiRef)
        {
            retVal = [self localWiFiStatusForFlags: flags];
        }
        else
        {
            retVal = [self networkStatusForFlags: flags];
        }
    }
    return retVal;
    }
    
  • 另外,如何更改下面的代码以仅获取
    NetworkStatusForFlags

    - (NetworkStatus) networkStatusForFlags: (SCNetworkReachabilityFlags) flags
    {
        if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
        {
            // if target host is not reachable
            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)
        {
            // ... but WWAN connections are OK if the calling application
            //     is using the CFNetwork (CFSocketStream?) APIs.
            retVal = ReachableViaWWAN;
        }
        return retVal;
    }
    
    编辑:

    我使用的主机名是www.apple.com,我也尝试过。但在WIFI中我得到的是真实的,只有在蜂窝网络中我得到的是虚假的

    + (MTPReachability*) reachabilityWithHostName: (NSString*) hostName;
    {
        MTPReachability* retVal = NULL;
        SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, [hostName UTF8String]);
        if(reachability!= NULL)
        {
            retVal= [[[self alloc] init] autorelease];
            if(retVal!= NULL)
            {
                retVal->reachabilityRef = reachability;
                retVal->localWiFiRef = NO;
            }
        }
        return retVal;
    }
    

    WIFI仅表示您使用的是本地WIFI连接(在IP地址的专用范围内),而不是设备上的WIFI连接


    您得到的唯一信息是您的应用程序是否可以连接到远程服务器。您无法获得有关它正在使用哪个连接的任何信息。

    1。
    SCNetworkReachabilityGetFlags(reachabilityRef,&flags)
    将确定使用当前网络配置是否可以访问给定目标

    2.请检查我的代码,通过它我可以检查网络的可达性

    + (BOOL) connectedToNetwork
    {
        // Create zero addy
        struct sockaddr_in zeroAddress;
        bzero(&zeroAddress, sizeof(zeroAddress));
        zeroAddress.sin_len = sizeof(zeroAddress);
        zeroAddress.sin_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 NO;
        }
    
        BOOL isReachable = flags & kSCNetworkFlagsReachable;
        BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
        return (isReachable && !needsConnection) ? YES : NO;
    }
    
    - (void) checkNetworkStatus:(NSNotification *)notice
    {
        // called after network status changes
    
        NetworkStatus netStatus = [internetReach currentReachabilityStatus];
        switch (netStatus)
        {
            case NotReachable:
            {
                if([reachabilityDelegate respondsToSelector:@selector(internetConnectionLost)])
                    [reachabilityDelegate internetConnectionLost];
                break;
    
            }
            case ReachableViaWiFi:
            case ReachableViaWWAN:
            {
                if([reachabilityDelegate respondsToSelector:@selector(internetConnectionRestored)] && [GlobalObjects connectedToNetwork])
                    [reachabilityDelegate internetConnectionRestored];
                break;
    
            }
        }
    }
    
    注意,“reachabilityDelegate”是一个委托,我定义它是为了获取其他类中的网络类。。“InternetRach”是可访问性类中的一个实例变量

    希望这会有所帮助。

    该行:

    **BOOL** retVal = NotReachable;
    
    这是无效的。这应该是:

    **NetworkStatus** retVal = NotReachable;
    
    在我们的例子中,它有助于在retVal中设置正确的值(即通过WWAN访问)


    否则,即使您在最后一个“如果”中输入,您也可以通过WIFI访问,因为它被强制转换为BOOL。

    这是正确的,但根据NetworkStatus标志,我可以知道它是WIFI还是WWAN。所以我只想…是的,WIFI是本地WIFI(即IP地址专用范围内的本地网络)。WWAN是广域网——“互联网”。您的蜂窝网络将无法访问您的本地网络,因为它正在通过移动运营商的网络进行连接。感谢Nick的回复,但您能否澄清您想要得出的结论??此外,我还编辑了我的问题,请看一下……我的意思是,您可以获得的唯一信息是您是否连接到本地网络(WIFI表示本地WIFI网络)或internet(WWAN表示无线广域网)。您不知道设备正在使用哪种传输服务连接到internet,只会被告知您已连接到internet。您可以使用手机或无线,但您的应用程序不知道(也不应该在意)。您对传输服务的看法是正确的。但我只是想,当我检查蜂窝网络的可用性时,它应该返回TRUE,而不关心它是否用于传输…我认为这是一个全球性的问题。。因为当我使用“whatsapp”并在应用程序上同时使用wifi和蜂窝数据时,突然停止发送消息,就像没有网络一样@Malek_Jundi:那么你的意思是没有解决方案???或者有其他的方法吗??请看我编辑的问题…请检查我下面的答案。我认为你对第二个问题的解释是错误的。我想要的是,当我的应用程序启动时,我检查WIFI和手机的可达性。虽然我两者都穿上了,但在手机的情况下,我是错的。你能告诉我上面的代码对我的情况有什么帮助吗???对不起,我不明白你的需要。。我只是和你分享我的代码,因为我认为它可能会帮助你。但是我觉得我不应该被否决!!你的评论很公正。。再次为错误的答案感到抱歉。我还没有完成投票对不起。我也不能放弃投票,因为我还没有找到正确的答案。我的问题也很简单,当我在手机和Wifi上检查可达性时,我应该得到这两种情况下的真实值。。。