【发布时间】:2016-02-25 14:12:55
【问题描述】:
我正在使用来自 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 似乎已连接。但是,由于错误值,我已经触发了一个事件,并且应用程序关闭了与服务器的连接,认为没有 wi-fi。
做了一些研究,我在 Reachability.m 文件的自述文件中发现了这个(由 Apple 提供)
默认情况下,应用程序使用 www.apple.com 作为其远程主机。您可以通过修改 -viewDidLoad 中 remoteHostName 变量的值来更改它在 APLViewController.m 中使用的主机。
重要提示:可达性必须先使用 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 类中有一个方法似乎是从 Apple 的演示中使用的。
- (BOOL)connectionRequired
{
NSAssert(_reachabilityRef != NULL, @"connectionRequired called with NULL reachabilityRef");
SCNetworkReachabilityFlags flags;
if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags))
{
return (flags & kSCNetworkReachabilityFlagsConnectionRequired);
}
return NO;
}
为什么需要connectionRequired?可以用来解决问题吗?
【问题讨论】:
-
为什么你每 10 分钟调用一次方法而不是你可以使用 github.com/ashleymills/Reachability.swift
-
我需要大约每 10 分钟触发一次 sip 注册事件
标签: ios reachability