2

我正在使用网络扩展框架以编程方式配置和连接 VPN 服务器。我可以启动和停止 VPN。我已经编写了以下代码来在 viewDidLoad 中配置 VPN。

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 并切换到 wifi,这种情况下 VPN 不会断开连接。
  2. 如果我在移动数据中连接 VPN 并切换到 wifi 然后回到移动数据 VPN 也不会断开连接。

问题是

如果我在 wifi 中连接 VPN,然后切换到移动数据,在这种情况下 VPN 正在停止。我希望 VPN 必须仅在用户停止 VPN 时才停止。

由于 VPN 停止,配置 VPN 时是否缺少任何步骤?

提前致谢。

4

1 回答 1

0

您需要添加规则以保持连接持久。同时启用 onDemand [manager setOnDemandEnabled:YES];

迅速

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

    let disconnectRule = NEOnDemandRuleDisconnect()
    disconnectRule.probeURL = URL(string:VPNCredentialsModel.instance.vpnProbeURL()!)
于 2016-11-25T20:36:42.420 回答