当WiFi处于活动状态时,iOS Reachability不会报告WiFi

cat*_*eof 6 reachability ios

我正在使用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?可以用来解决问题吗?

Wai*_*ain 1

应使用主机名而不是显式地址来创建可达性。DNS 系统的重点在于主机的地址有时会发生变化。直接链接到名称服务器应该在这方面提供一些安全性,但这不是它应该如何工作的。

可达性通常是最好的猜测,而不是硬性规定。唯一确定的方法就是实际尝试。所需的连接与此相关,因为设备说“一切看起来都不错,我只是还没有尝试真正连接”。

因此,可以说您应该在不检查可达性状态的情况下触发保持活动状态,并使用请求的结果来确定是否存在错误。如果您需要确定,请发送实际请求并查看实际结果。