网络更改可达性通知不适用于启用VPN的应用

时间:2016-09-16 21:26:29

标签: ios objective-c vpn reachability

我正在开发一款配置为与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:,因为该应用会连接到各个域。

1 个答案:

答案 0 :(得分:2)

有趣。我碰巧是使用Reachability类的VPN应用程序的作者,因此我能够设置一些断点并查看发生了什么。

我的应用支持OpenVPN和IKEv2。我试过了两个,这就是我发现的:

IKEv2 (通过Apple的NetworkExtension框架):即使VPN连接处于活动状态,也可以正确传递可达性消息。 (通过拔以太网电缆验证)。

OpenVPN :连接VPN时,可用性消息 传递。拔出插头,重新插入,直到我从应用程序内断开VPN之后才收到任何通知。

从他们的网站上看,Pulse VPN使用的后端并不是很清楚。如果他们使用OpenVPN,你可能会失去运气。

OpenVPN的工作方式是通过“tun”和“tap”设备将自身注入网络流量(想想隧道和窃听)。在这样做时,它可能会抑制Apple用于生成可达性通知的任何内容。不过,你可能需要与Apple谈论这种特殊性。

严厉的解决方案是在计时器的某个地方对服务器进行HTTP GET。这样就不那么优雅了,所以请谨慎使用,并且只能在最严峻的情况下使用。