VPN останавливается, когда сеть переключается с Wi-Fi на мобильные данные. VPN подключается программно в iOS

Я использую платформу Network Extension для настройки и подключения VPN-сервера программно. Я могу запускать и останавливать VPN. Я написал следующий код для настройки VPN в viewDidLoad.

NEVPNManager *manager = [NEVPNManager sharedManager];
[manager loadFromPreferencesWithCompletionHandler:^(NSError *error) {

        if(manager.protocol == nil)
        {
            NSString *filePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"VPNCert" ofType:@"p12"];
            NSData *certData = [NSData dataWithContentsOfFile:filePath];
            NSString *certPassword = @"password";

            NSString *vpnUsername = @"username";
            NSString *vpnPassword = @"password";
            NSString *vpnUrl = @"VPN Server IP";

            // This saves my credentials to the keychain and returns a persistent keychain reference
            NSData *passRef = [self addVPNCredentialsToKeychain:vpnUsername withPassword:vpnPassword];

            NEVPNProtocolIPSec *p = [[NEVPNProtocolIPSec alloc] init];
            p.authenticationMethod = NEVPNIKEAuthenticationMethodCertificate;
            p.serverAddress = vpnUrl;
            p.username = vpnUsername;
            p.passwordReference = passRef;
            p.identityData = certData;
            p.identityDataPassword = certPassword;
            p.disconnectOnSleep = NO;
            p.useExtendedAuthentication = YES;

            manager.protocol = p;
            manager.enabled = YES;
            [manager setOnDemandEnabled:NO];
            [manager setLocalizedDescription:@"VPN Network"];
            [manager saveToPreferencesWithCompletionHandler:^(NSError *error) {

                if(error)
                {
                    NSLog(@"Load error: %@", error);
                }
            }];
        }
    }];

Я также написал код для запуска VPN при нажатии кнопки.

- (IBAction)buttonPressed:(id)sender {

    NEVPNManager *manager = [NEVPNManager sharedManager];
    [manager loadFromPreferencesWithCompletionHandler:^(NSError *error) {

                if (!error)
                {
                    NSError *startError = [[NSError alloc] init];
                    [[NEVPNManager sharedManager].connection startVPNTunnelAndReturnError:&startError];
                }
            }];
}

Кейсы, работающие на меня.

  1. Если я подключаю VPN к мобильным данным и переключаюсь на Wi-Fi, в этом случае VPN не отключается.
  2. Также работает, если я подключаю VPN к мобильным данным и переключаюсь на Wi-Fi, а затем обратно к мобильным данным. VPN не отключается.

Проблема в том,

Если я подключаю VPN через Wi-Fi, а затем переключаюсь на мобильные данные, в этом случае VPN останавливается. Я хочу, чтобы VPN останавливался только тогда, когда пользователь остановит VPN.

Пропущены ли какие-либо шаги при настройке VPN из-за того, что VPN останавливается?

Заранее спасибо.


person Rayan Dsouza    schedule 11.12.2015    source источник


Ответы (1)


Вам нужно будет добавить правила, чтобы сохранить соединение. Также включите onDemand [менеджер setOnDemandEnabled:YES];

Свифт

    let connectRule = NEOnDemandRuleConnect()
    connectRule.interfaceTypeMatch = .any

    let disconnectRule = NEOnDemandRuleDisconnect()
    disconnectRule.probeURL = URL(string:VPNCredentialsModel.instance.vpnProbeURL()!)
person Siddharthan Asokan    schedule 25.11.2016
comment
Разве вам не нужно прослушивать изменения defaultPath, используя KVO, чтобы вызвать переподключение? - person Ricardo; 21.07.2018