我正在开发一个配置为与 Pulse Secure VPN 配合使用的 iOS 应用程序。我已订阅可达性更改通知以记录网络关闭情况。 AppDelegate.m 中的以下代码工作正常。如果启用了每个应用 VPN,则它无法识别网络更改(LTE 到飞行模式,反之亦然)。
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.reachability = [Reachability reachabilityForInternetConnection];
[self.reachability startNotifier];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
}
- (void) reachabilityChanged:(NSNotification *)note
{
Reachability* curReach = [note object];
NetworkStatus netStatus = [reachability currentReachabilityStatus];
switch (netStatus)
{
case NotReachable:
{
break;
}
case ReachableViaWWAN:
{
break;
}
case ReachableViaWiFi:
{
break;
}
}
}
了解我是否需要为启用 VPN 的应用程序进行额外配置会很有帮助。我无法使用 reachabilityWithHostName:
因为该应用程序连接到各个域。
最佳答案
有趣。我碰巧是一个使用 Reachability 类的 VPN 应用程序的作者,因此我能够设置一些断点并查看发生了什么。
我的应用程序支持 OpenVPN 和 IKEv2。我都尝试了,这就是我的发现:
IKEv2(通过 Apple 的 NetworkExtension 框架):即使 VPN 连接处于事件状态,也能正确传送可达性消息。 (通过拉动以太网电缆进行验证)。
OpenVPN:连接 VPN 时不会传送可达性消息。拔掉插头,重新插上,直到我从应用程序内断开 VPN 后才收到任何通知。
从他们的网站上并不清楚 Pulse VPN 使用哪个后端。如果他们使用 OpenVPN,你可能就不走运了。
OpenVPN 的工作方式是通过“tun”和“tap”设备(想想隧道和窃听)将自身注入(inject)到您的网络流量中。这样做时,它可能会抑制苹果用于生成可达性通知的任何内容。不过,您可能需要与 Apple 联系以获得该级别的具体信息。
严厉的解决方案是在计时器上对某处的服务器执行 HTTP GET。这很不优雅,因此请谨慎使用,并且仅在最糟糕的情况下使用。
关于ios - 网络更改可达性通知不适用于启用 VPN 的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39540313/