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

标签 iphone objective-c ios ios5 reachability

我正在使用 Apple's Reachability code , 以确定是否存在 Internet 连接。

现在我发现,当我同时打开蜂窝网络和 WIFI 时,我对蜂窝网络的检查显示 FALSE,而我的 WIFI 检查显示 TRUE。

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

谁能帮我解决这个问题???

我想要的是当两个网络都打开时,我的 Reachability 应该对两者都显示 TRUE。

任何人都可以帮助我理解以下几点:

  1. SCNetworkReachabilityGetFlags(reachabilityRef, &flags) 究竟会做什么?

  2. 如何在下面的代码中只检查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 并尝试了 http://www.apple.com .但是在 WIFI 中我得到 TRUE,只有在蜂窝网络中我得到 FALSE。

+ (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;
}

最佳答案

行:

**BOOL** retVal = NotReachable;

无效。这应该是:

**NetworkStatus** retVal = NotReachable;

在我们的例子中,它有助于在 retVal 中设置正确的值(即 ReachableViaWWAN)。

否则,即使您输入最后一个“if”,您也会得到 ReachableViaWiFi,因为它被转换为 BOOL。

关于iphone - 当 Wi-Fi 和蜂窝网络都打开时,蜂窝网络的可达性返回 False,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9923682/

相关文章:

ios - 社交媒体应用程序的最佳压缩质量?

iphone - 使用 ActionScript 3 的触摸事件与鼠标单击事件

iphone - 如何使用 ITK 库在 iOS 上加载 DICOM 图像?

iphone - 同一个 UITextField 中的居中占位符,但大小不同

ios - 使用 Objective-C 中的 Swift ObservableObject 时出现链接器错误

ios - NSSortDescriptor 中文...怎么样?

iphone - rec、av基础框架的循环持续时间

ios - 在 UIView IOS 中按任意位置时移动带有触摸的 UIImageview

c# - 难以绑定(bind)不带参数的 iOS 委托(delegate)方法

iOS NSTimer 不工作?