我正在使用苹果提供的Reachability类来检测对我的应用程序功能有影响的网络事件。这是一个Voip应用程序,它使用setKeepAliveTimeout,因此每10分钟左右会被唤醒以读取网络状态,并决定是否需要刷新连接。
BOOL res = [app setKeepAliveTimeout:600 handler:^{
[[WIFI instance] isWifiConnected];
[[AClass an_instance] refresh];
}
}];
所以每10分钟调用isWifiConnected函数,应用程序再次读取网络状态。
- (BOOL) isWifiConnected {
self.wifiReach = [Reachability reachabilityForLocalWiFi];
NetworkStatus wifiStatus = [self.wifiReach currentReachabilityStatus];
switch (wifiStatus) {
case NotReachable: {
m_wifiConnected = NO;
LOG(@"NetStatus:NotReachable");
break;
}
case ReachableViaWiFi: {
m_wifiConnected = YES;
m_wwanConnected = NO;
LOG(@"NetStatus:ReachableViaWiFi");
break;
}
}
return m_wifiConnected;
}
尽管设备上有WiFi,但通话返回false,即没有WiFi,而且网络状态为NotReachable。然而,在非常短的时间间隔后,可达性回调再次被调用,wifi似乎已经连接。然而,由于错误值,我已经触发了一个事件,并且应用程序关闭了与服务器的连接,认为没有wifi。
在Reachability.m文件的Readme文件中(由Apple提供),我找到了以下内容:
默认情况下,应用程序使用www.apple.com作为其远程主机。您可以通过修改-viewDidLoad中的remoteHostName变量的值来更改它使用的主机名。
重要提示:在确定主机的可达性之前,可达性必须使用DNS解析主机名,这可能需要一些时间在某些网络连接上。因此,API将返回NotReachable,直到名称解析完成。在某些网络上,此延迟可能在界面上可见。
这可能是问题吗?DNS查找的延迟?还是我需要改进我的代码?
当我初始化应用程序时,我调用了这个。
self.hostReach = [Reachability reachabilityWithHostName: @"www.apple.com"];
如果我使用这样的IP地址是正确的吗?
self.hostReach = [Reachability reachabilityWithHostName: @"1.2.3.4"];
使用公共IP是否安全?例如,“17.178.96.59”是对apple.com进行nslookup的结果。
在Reachability类中有一种方法,似乎是从苹果演示中使用的。
- (BOOL)connectionRequired
{
NSAssert(_reachabilityRef != NULL, @"connectionRequired called with NULL reachabilityRef");
SCNetworkReachabilityFlags flags;
if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags))
{
return (flags & kSCNetworkReachabilityFlagsConnectionRequired);
}
return NO;
}
为什么需要connectionRequired?它能解决问题吗?