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

标签 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: 因为该应用程序连接到各个域。

最佳答案

有趣。我碰巧是一个使用 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/

相关文章:

ios - Swift - 在 ViewController 之间切换不起作用

ios - iPad3 中带有图像的 UIPageViewController 在内存中缓存所有 View Controller

objective-c - 优化数据库调用

node.js - 强制 node.exe 在 Windows 10 上抛出 proxifier

Python selenium 防止网站被阻塞

ios - swift IOS : How to download image using NSURLSession and didReciveData?

ios - 如何在 Swift 中强制设备旋转?

iphone - AFNetworking - 如何发出 POST 请求

ios - 设置UIBezierPath的lineWidth不起作用

java - 如何将 OpenVPN 客户端应用程序与另一个安卓应用程序合并?