Как проверить VPN-соединение в iPhone - PullRequest
5 голосов
/ 15 ноября 2011

Я новичок в этом развитии.Я много искал по Интернету, но не могу найти правильного решения для этого.Я хочу проверить доступность VPN в моем приложении iPhone, так как я получаю данные с клиентского компьютера, который подключен через VPN.Я проверил, доступно ли интернет-соединение, но не смог проверить, подключен ли VPN или нет.Пожалуйста, предложите мне это.

Ответы [ 5 ]

11 голосов
/ 18 июля 2014

Я только что нашел другой способ проверить 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;
}
5 голосов
/ 12 ноября 2017

Для исправления ответа Тимура Сулейманова, протестированного на iOS 11, нужно искать интерфейс 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 голосов
/ 13 февраля 2019

Вот 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
        }



    }
}
1 голос
/ 01 июня 2012

Если вы хотите пинговать функцию, вы можете сделать что-то вроде этого;

  1. Настройка сокета на ваш внутренний ip
  2. Сделать розетку без блока
  3. Использование выбора для проверки состояния сокета

Это работает для меня

0 голосов
/ 15 ноября 2011

Ping или Lookup адрес, который должен быть доступен только в VPN, если вы можете подключиться, VPN используется.

...