iphone - 如何检测 iphone 的 VPN 连接?

标签 iphone ios objective-c vpn

我需要以编程方式检测 iphone 是否连接到 VPN。我正在开发一个尝试加载 URL 的应用程序,此页面仅在设备连接到 VPN 时打开。在加载此 URL 之前,我需要检查 VPN 连接。我尝试了以下。但这并没有按预期工作。

- (BOOL)checkForVPNConnectivity {
  NSDictionary *dict = (__bridge NSDictionary *)(CFNetworkCopySystemProxySettings());
  //NSLog(@"cfnetwork proxy setting : %@", dict);
  return [dict count] > 0; 
 }

最佳答案

我认为不应通过检查 CFNetworkCopySystemProxySettings() 中的非零元素数来确定 VPN 连接。 (例如,我在 WiFi 网络上看到条目,但在 VPN 上看不到。)

因此,有两个观察结果:

  1. 我会考虑使用 SystemConfiguration.framework 并将以下代码与您 VPN 上的主机名一起使用:

    - (BOOL)checkForConnectivity:(NSString *)hostName
    {
        BOOL success = false;
    
        SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, [hostName UTF8String]);
        SCNetworkReachabilityFlags flags;
        success = SCNetworkReachabilityGetFlags(reachability, &flags);
        CFRelease(reachability);
    
        NSLog(@"success=%x", flags);
    
        // this is the standard non-VPN logic, you might have to alter it for VPN connectivity
    
        BOOL isAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
        if (isAvailable) {
            NSLog(@"Host is reachable: %d", flags);
            return YES;
        }else{
            NSLog(@"Host is unreachable");
            return NO;
        }
    }
    

    假设 success 不为零,您可能需要对 flags 中的位设置进行一些实证研究。参见 SCNetworkReachability Reference有关这些标志的技术定义。我听说他们得到了 kSCNetworkReachabilityFlagsReachable | kSCNetworkReachabilityFlagsTransientConnection 当 VPN 已连接时,但我没有 VPN,因此我无法测试该声明。我建议在开启和不开启 VPN 的情况下进行尝试,看看是否会返回不同的标志

  2. 与手头的问题无关,您的代码示例会泄漏。如果使用 ARC,请不要忘记使用 CFBridgingRelease__bridge_transfer。或者不管是否在 ARC 中,在返回之前显式调用 CFRelease

    如果您运行静态分析器(按 shift+command+B 或从“产品”菜单中选择“分析”) Xcode 的最新版本,它应该警告您有关 Core Foundation 调用的内存管理。

    无论如何,这就是我倾向于在 ARC 中处理它的方式:

    - (BOOL)checkForVPNConnectivity
    {
        NSDictionary *dict = CFBridgingRelease(CFNetworkCopySystemProxySettings());
    
        return [dict count] > 0;
    }
    

关于iphone - 如何检测 iphone 的 VPN 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16285093/

相关文章:

ios - 为什么 AppCode 3.0 不允许我使用最新的 Xcode 6.0 beta 选择 Base SDK = iOS 7.1?

ios - 如何在 iOS 上实现方框或高斯模糊

ios - 将 NSData 与字节序列进行比较?

java - 使用 Objective-C 加密数据并使用 Java 问题解密

iphone - 如何在iPhone上放大/放大/缩放UIImageView的特定部分?

ios - 来自 Facebook 的高分辨率图片

iOS UIButton 点击​​不起作用

php - 您在应用程序中使用什么 MySQL 日期/时间类型,为什么?

iphone - UIKitBackgroundCompletionTask - iPhone 应用程序崩溃

iphone - 在越狱 iPhone 上测试应用程序