在iOS 8中以编程方式连接到VPN - 代码日志

在iOS 8中以编程方式连接到VPN

自从发布iOS 8测试版以来,我发现了一个网络扩展框架,它将使开发人员以编程方式配置和连接到VPN服务器,而不需要安装任何配置文件。

该框架包含一个名为NEVPNManager的主要类。这个类还有三个主要的方法,让我保存,加载或删除VPN偏好。我在viewDidLoad方法中写了一段代码如下:

NEVPNManager *manager = [NEVPNManager sharedManager];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(vpnConnectionStatusChanged) name:NEVPNStatusDidChangeNotification object:nil];
[manager loadFromPreferencesWithCompletionHandler:^(NSError *error) {
    if(error) {
        NSLog(@"Load error: %@", error);
    }}];
NEVPNProtocolIPSec *p = [[NEVPNProtocolIPSec alloc] init];
p.username = @“[My username]”;
p.passwordReference = [KeyChainAccess loadDataForServiceNamed:@"VIT"];
p.serverAddress = @“[My Server Address]“;
p.authenticationMethod = NEVPNIKEAuthenticationMethodCertificate;
p.localIdentifier = @“[My Local identifier]”;
p.remoteIdentifier = @“[My Remote identifier]”;
p.useExtendedAuthentication = NO;
p.identityData = [My VPN certification private key];
p.disconnectOnSleep = NO;
[manager setProtocol:p];
[manager setOnDemandEnabled:NO];
[manager setLocalizedDescription:@"VIT VPN"];
NSArray *array = [NSArray new];
[manager setOnDemandRules: array];
NSLog(@"Connection desciption: %@", manager.localizedDescription);
NSLog(@"VPN status:  %i", manager.connection.status);
[manager saveToPreferencesWithCompletionHandler:^(NSError *error) {
   if(error) {
      NSLog(@"Save error: %@", error);
   }
}];

我还在我的视图中放置了一个按钮,并将其TouchUpInside操作设置为以下方法:

- (IBAction)buttonPressed:(id)sender {
   NSError *startError;
   [[NEVPNManager sharedManager].connection startVPNTunnelAndReturnError:&startError];
   if(startError) {
      NSLog(@"Start error: %@", startError.localizedDescription);
   }
}

这里有两个问题:

1)当我尝试保存首选项时,会抛出以下错误:Save error:Error Domain = NEVPNErrorDomain Code = 4“操作无法完成(NEVPNErrorDomain错误4。)”这是什么错误?我解决了这个问题?

2)[[NEVPNManager sharedManager] .connection startVPNTunnelAndReturnError:& startError];方法在调用它时不会返回任何错误,但连接状态从Disconnected连接稍稍更改,然后恢复到Disconnected状态。

任何帮助将不胜感激 :)

问题是保存时遇到的错误:
保存错误:错误域= NEVPNErrorDomain代码= 4

如果您查看NEVPNManager.h头文件,您将看到错误代码4是“NEVPNErrorConfigurationStale”。配置过时,需要加载。
您应该调用loadFromPreferencesWithCompletionHandler:并在完成处理程序中修改要修改的值,然后调用saveToPreferencesWithCompletionHandler:。您的问题的示例是在加载完成之前修改配置,这就是为什么您收到此错误。

更像这样:

[manager loadFromPreferencesWithCompletionHandler:^(NSError *error) {
     // do config stuff
     [manager saveToPreferencesWithCompletionHandler:^(NSError *error) {
     }];
}];
http://stackoverflow.com/questions/24970280/connect-to-vpn-programmatically-in-ios-8

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在iOS 8中以编程方式连接到VPN