我正在开发一款配置为与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:
,因为该应用会连接到各个域。
答案 0 :(得分:2)
有趣。我碰巧是使用Reachability类的VPN应用程序的作者,因此我能够设置一些断点并查看发生了什么。
我的应用支持OpenVPN和IKEv2。我试过了两个,这就是我发现的:
IKEv2 (通过Apple的NetworkExtension框架):即使VPN连接处于活动状态,也可以正确传递可达性消息。 (通过拔以太网电缆验证)。
OpenVPN :连接VPN时,可用性消息 传递。拔出插头,重新插入,直到我从应用程序内断开VPN之后才收到任何通知。
从他们的网站上看,Pulse VPN使用的后端并不是很清楚。如果他们使用OpenVPN,你可能会失去运气。
OpenVPN的工作方式是通过“tun”和“tap”设备将自身注入网络流量(想想隧道和窃听)。在这样做时,它可能会抑制Apple用于生成可达性通知的任何内容。不过,你可能需要与Apple谈论这种特殊性。
严厉的解决方案是在计时器的某个地方对服务器进行HTTP GET。这样就不那么优雅了,所以请谨慎使用,并且只能在最严峻的情况下使用。