我目前正在编写一些代码,以确定网络请求是否可能在Mac或iOS上。
在我被告知查看Apple提供的Reachability类之前,我只是想指出,即使使用它们,我也会得到相同的结果。所以,我想我应该写我自己的,因为这是我所需要的。
我已经启动了一个与Apple完全相同的可达性对象:
+ (Reachability*) reachabilityForInternetConnection;
{
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
return [self reachabilityWithAddress: &zeroAddress];
}
然后调用[networkStatusForFlags:flags]
(或在我的代码中与其等价的),我有以下内容:
NSLog(@"Reachability Flag Status: %c%c %c%c%c%c%c%c%cn",
(flags & kSCNetworkReachabilityFlagsIsWWAN) ? 'W' : '-',
(flags & kSCNetworkReachabilityFlagsReachable) ? 'R' : '-',
(flags & kSCNetworkReachabilityFlagsTransientConnection) ? 't' : '-',
(flags & kSCNetworkReachabilityFlagsConnectionRequired) ? 'c' : '-',
(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) ? 'C' : '-',
(flags & kSCNetworkReachabilityFlagsInterventionRequired) ? 'i' : '-',
(flags & kSCNetworkReachabilityFlagsConnectionOnDemand) ? 'D' : '-',
(flags & kSCNetworkReachabilityFlagsIsLocalAddress) ? 'l' : '-',
(flags & kSCNetworkReachabilityFlagsIsDirect) ? 'd' : '-'
);
BOOL thereIsInternetAccess = NO;
if ((flags & kSCNetworkReachabilityFlagsReachable) != 0 && (flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
{
thereIsInternetAccess = YES;
}
else
{
thereIsInternetAccess = NO;
}
无论我的Mac的Wifi是打开还是关闭,我得到以下输出到控制台Reachability Flag Status: -R -----l-
,这对我来说表明互联网存在(由于R
被标记)
我错过了什么吗?如有任何帮助,不胜感激。
注意:我正在使用iOS模拟器。不过我觉得这没什么大不了的
iOS模拟器不像你期望的那样工作。
使用网络可达性的系统配置框架确实通知Mac的网络状态已经使用注册回调(SCNetworkReachabilitySetCallback
)更新。然而,从我的测试来看,似乎每次都没有正确返回标志。在带有Mac应用目标的Mac或iOS设备上使用相同的代码,代码将以预期的结果运行。
这也是为什么模拟器不应该成为应用程序唯一测试手段的另一个原因。