当WiFi处于活动状态时,iOS可访问性报告无WiFi

时间:2016-02-25 14:12:56

标签: ios reachability

我正在使用Apple的Reachability class来检测对我的应用功能有影响的网络事件。它是一个使用setKeepAliveTimeout的voip应用程序,因此每隔~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似乎已连接。但是我已经因为错误值而触发了一个事件,并且app关闭了与服务器的连接,认为没有wi-fi。

我做了一些研究,我在Reachability.m文件的自述文件中找到了这个(由Apple提供)

默认情况下,应用程序将www.apple.com用于其远程主机。您可以通过修改-viewDidLoad中remoteHostName变量的值来更改它在APLViewController.m中使用的主机。

  

重要提示:可达性必须使用DNS来解析主机名   它可以确定该主机的可达性,这可能需要一些时间   在某些网络连接上。因此,API将返回   在名称解析完成之前无法访问。这种延迟可能是   在某些网络的界面中可见

这可能是问题吗? dns查找的延迟?或者我是否还需要增强我的代码?

当我初始化应用时,我称之为

self.hostReach = [Reachability reachabilityWithHostName: @"www.apple.com"];

如果我使用这样的IP地址是正确的吗?

self.hostReach = [Reachability reachabilityWithHostName: @"1.2.3.4"];

使用公共IP是否安全?例如,“17.178.96.59”是nslookup for apple.com的结果

Reachability类中有一种似乎可以从Apple的演示中使用的方法。

- (BOOL)connectionRequired
{
    NSAssert(_reachabilityRef != NULL, @"connectionRequired called with NULL reachabilityRef");
    SCNetworkReachabilityFlags flags;

    if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags))
    {
        return (flags & kSCNetworkReachabilityFlagsConnectionRequired);
    }

    return NO;
}

为什么需要connectionRequired?可以用来解决问题吗?

2 个答案:

答案 0 :(得分:2)

为了节省电池电量,iOS会在没有被主动使用的情况下关闭网络硬件。这意味着关闭WiFi和蜂窝无线电。在这种情况下,Reachability无法报告完整的结果,因为它无法在不重新打开所有内容的情况下检查情况。这就是kSCNetworkReachabilityFlagsConnectionRequired的用途 - 告诉您需要建立连接以唤醒硬件。

你所看到的可能是手机解锁时醒来的东西(你的应用程序或其他具有后台权限的应用程序),所以一切都醒来,你立即看到错误,但随后WiFi连接,你再次连接。

你需要处理可达性,好像它可以告诉你"绝对可以到达"或者"绝对无法到达"而且"情况未知"。您需要决定在未知情况下您将要做什么。如果您立即建立网络连接,那么您将比平时更快地耗尽电池。另一种方法可能就是等待网络被其他原因唤醒。这真的取决于你。

答案 1 :(得分:0)

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

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

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