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