【问题标题】:How to check VPN Connectivity in iPhone如何在 iPhone 中检查 VPN 连接
【发布时间】:2011-12-29 05:30:24
【问题描述】:

我对这个发展很陌生。 我在互联网上搜索了很多,但找不到任何合适的解决方案。 我想检查我的 iPhone 应用程序中可用的 VPN 连接,因为我正在从通过 VPN 连接的客户端机器获取数据。 我确实检查了 Internet 连接是否可用,但无法检查 VPN 是否已连接。 请就此向我提出建议。

【问题讨论】:

    标签: ios vpn


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。您能否提供一些代码或逻辑来查找用户无需花费太多时间等待的地址。谢谢..
    【解决方案2】:

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

    1. 为您的内部 IP 设置一个套接字
    2. 使套接字不阻塞
    3. 使用 select 检查套接字状态

    它对我有用

    【讨论】:

    • 感谢您的回复。你能提供我可以实现的任何小代码或库参考吗?
    【解决方案3】:

    我刚刚找到了另一种检查 VPN 连接的方法,但在任何地方都没有提到。 您可以使用 getifaddrs() 来获取当前的网络接口。 然后遍历它们并检查它们的名称。如果其中任何一个包含 taptunppp,则用户已连接 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;
    }
    

    【讨论】:

    • 你能告诉我我必须为此导入任何框架吗?我的意思是#import?
    • @harshalb 我没有,没有。但是你可以试试#include
    • @TimurSuleimanov 您的两个代码 sn-ps 都不再起作用(我使用的是 iOS 10)。知道如何解决这个问题吗?
    • 所有基于 SCOPED 的解决方案都不能可靠地与 IPSec VPN 配合使用,即使您将“ipsec”添加到密钥检测逻辑中也是如此。
    【解决方案4】:

    要修复在 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;
    }
    

    【讨论】:

      【解决方案5】:

      这里是 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
              }
      
      
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-04-23
        • 2012-07-30
        • 2019-04-09
        • 2015-10-22
        • 2012-06-06
        • 2019-06-26
        • 2011-03-12
        • 2012-03-23
        • 2019-04-18
        相关资源
        最近更新 更多