我正在使用网络扩展框架以编程方式配置和连接 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];
}
}];
}
为我工作的案例。
- 如果我在移动数据中连接 VPN 并切换到 wifi,这种情况下 VPN 不会断开连接。
- 如果我在移动数据中连接 VPN 并切换到 wifi 然后回到移动数据 VPN 也不会断开连接。
问题是
如果我在 wifi 中连接 VPN,然后切换到移动数据,在这种情况下 VPN 正在停止。我希望 VPN 必须仅在用户停止 VPN 时才停止。
由于 VPN 停止,配置 VPN 时是否缺少任何步骤?
提前致谢。