如何在iPhone中检查VPN连接

时间:2011-11-15 05:13:47

标签: ios vpn

我是这个发展的新手。 我在互联网上搜索了很多,但无法找到适当的解决方案。 我想检查我的iPhone应用程序中可用的VPN连接,因为我从通过VPN连接的客户端计算机获取数据。 我确实检查了Internet连接是否可用但无法检查VPN是否已连接。 请建议我。

5 个答案:

答案 0 :(得分:11)

我刚刚找到另一种检查VPN连接的方法,这在任何地方都没有提到过。 您可以使用getifaddrs()来获取当前的网络接口。 然后迭代它们并检查它们的名字。如果其中任何一个包含点按 tun ppp ,则用户已连接VPN。

  - (BOOL)isVPNConnected
{
    struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr = NULL;
    int success = 0;

    // retrieve the current interfaces - returns 0 on success
    success = getifaddrs(&interfaces);
    if (success == 0) {
        // Loop through linked list of interfaces
        temp_addr = interfaces;
        while (temp_addr != NULL) {
            NSString *string = [NSString stringWithFormat:@"%s" , temp_addr->ifa_name];
            if ([string rangeOfString:@"tap"].location != NSNotFound ||
                [string rangeOfString:@"tun"].location != NSNotFound ||
                [string rangeOfString:@"ppp"].location != NSNotFound){
                return YES;
            }

            temp_addr = temp_addr->ifa_next;
        }
    }

    // Free memory
    freeifaddrs(interfaces);
    return NO;
}

UPD:在iOS 9上面的代码无效。无论VPN是否连接,接口都是相同的。在这种情况下请尝试以下代码:

 - (BOOL)isVPNConnected
{
    NSDictionary *dict = CFBridgingRelease(CFNetworkCopySystemProxySettings());
        NSArray *keys = [dict[@"__SCOPED__"]allKeys];
        for (NSString *key in keys) {
            if ([key rangeOfString:@"tap"].location != NSNotFound ||
                [key rangeOfString:@"tun"].location != NSNotFound ||
                [key rangeOfString:@"ppp"].location != NSNotFound){
                return YES;
            }
        }
        return NO;
}

答案 1 :(得分:5)

要修复在iOS 11上测试的Timur Suleimanov答案,您需要寻找IPSec接口;

- (BOOL)isVPNConnected {
    NSDictionary *dict = CFBridgingRelease(CFNetworkCopySystemProxySettings());
    NSArray *keys = [dict[@"__SCOPED__"]allKeys];
    for (NSString *key in keys) {
        if ([key rangeOfString:@"tap"].location != NSNotFound ||
            [key rangeOfString:@"tun"].location != NSNotFound ||
            [key rangeOfString:@"ipsec"].location != NSNotFound ||
            [key rangeOfString:@"ppp"].location != NSNotFound){
            return YES;;
        }
    }
    return NO;
}

答案 2 :(得分:2)

这是代码的Swift版本

var isVPNConnectd : Bool {
    get {
        if let dict = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as? Dictionary<String, AnyObject>,
            let keys = (dict["__SCOPED__"] as? [String : AnyObject])?.keys {
            for key in keys {
                if key.range(of: "tap") != nil ||
                    key.range(of: "tun") != nil ||
                    key.range(of: "ipsec") != nil ||
                    key.range(of: "ppp") != nil {
                    return true
                }
            }
            return false
        }
        else {
            return false
        }



    }
}

答案 3 :(得分:1)

如果你想ping功能,你可以做这样的事情;

  1. 设置内部ip的套接字
  2. 使套接字无阻塞
  3. 使用select检查套接字状态
  4. 它为我工作

答案 4 :(得分:0)

Ping或查找只应在VPN上可用的地址,如果可以连接VPN正在使用中。