我正在使用Apple的Reachability类来检测对我的应用程序功能有影响的网络事件.它是一个使用setKeepAliveTimeout的voip应用程序,因此每隔~10分钟唤醒会读取网络状态并决定是否应刷新连接.
BOOL res = [app setKeepAliveTimeout:600 handler:^{
[[WIFI instance] isWifiConnected];
[[AClass an_instance] refresh];
}
}];
Run Code Online (Sandbox Code Playgroud)
因此,每隔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;
}
Run Code Online (Sandbox Code Playgroud)
虽然设备中有WiFi,但呼叫返回false,即没有WiFi,而且网络状态为NotReachable.
然而,在很短的时间间隔之后,再次调用可达性回调并且似乎连接了wifi.但是我已经因为错误值而触发了一个事件,并且app关闭了与服务器的连接,认为没有wi-fi.
我做了一些研究,我在Reachability.m文件的自述文件中找到了这个(由Apple提供)
默认情况下,应用程序将www.apple.com用于其远程主机.您可以通过修改-viewDidLoad中remoteHostName变量的值来更改它在APLViewController.m中使用的主机.
重要信息:可访问性必须使用DNS来解析主机名,然后才能确定该主机的可访问性,这可能需要一些网络连接的时间.因此,在名称解析完成之前,API将返回NotReachable.在某些网络的接口中可能会看到此延迟
.
这可能是问题吗?dns查找的延迟?或者我是否还需要增强我的代码?
当我初始化应用程序时,我称之为
self.hostReach = [Reachability reachabilityWithHostName: @"www.apple.com"];
Run Code Online (Sandbox Code Playgroud)
如果我使用这样的IP地址是正确的吗?
self.hostReach = [Reachability reachabilityWithHostName: @"1.2.3.4"];
Run Code Online (Sandbox Code Playgroud)
使用公共IP是否安全?例如,"17.178.96.59"是针对apple.com的nslookup的结果
在Reachability类中有一种似乎可以从Apple的演示中使用的方法.
- (BOOL)connectionRequired
{
NSAssert(_reachabilityRef != NULL, @"connectionRequired called with NULL reachabilityRef");
SCNetworkReachabilityFlags flags;
if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags))
{
return (flags & kSCNetworkReachabilityFlagsConnectionRequired);
}
return NO;
}
Run Code Online (Sandbox Code Playgroud)
为什么需要connectionRequired?可以用来解决问题吗?
应使用主机名而不是显式地址来创建可达性。DNS 系统的重点在于主机的地址有时会发生变化。直接链接到名称服务器应该在这方面提供一些安全性,但这不是它应该如何工作的。
可达性通常是最好的猜测,而不是硬性规定。唯一确定的方法就是实际尝试。所需的连接与此相关,因为设备说“一切看起来都不错,我只是还没有尝试真正连接”。
因此,可以说您应该在不检查可达性状态的情况下触发保持活动状态,并使用请求的结果来确定是否存在错误。如果您需要确定,请发送实际请求并查看实际结果。