我正在使用 Apple's Reachability code , 以确定是否存在 Internet 连接。
现在我发现,当我同时打开蜂窝网络和 WIFI 时,我对蜂窝网络的检查显示 FALSE,而我的 WIFI 检查显示 TRUE。
我已经尝试为此修改 NetworkStatus 返回值。但没有成功。
谁能帮我解决这个问题???
我想要的是当两个网络都打开时,我的 Reachability 应该对两者都显示 TRUE。
任何人都可以帮助我理解以下几点:
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 并尝试了 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/