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

时间:2014-07-26 10:57:10

标签: ios objective-c ios8 vpn

自iOS 8测试版发布以来,我在其捆绑包中找到了一个网络扩展框架,该框架将允许开发人员以编程方式配置和连接到VPN服务器,而无需安装任何配置文件。

该框架包含一个名为NEVPNManager的主要类。这个类还有3个主要方法,可以让我保存,加载或删除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)当我尝试保存首选项时,将抛出以下错误:保存错误:错误Domain = NEVPNErrorDomain Code = 4"操作无法完成。 (NEVPNErrorDomain错误4。)“这是什么错误?我该如何解决这个问题?

2)[[NEVPNManager sharedManager] .connection startVPNTunnelAndReturnError:& startError];当我调用它时,方法不会返回任何错误,但是连接状态从Disconnected更改为Connecting一会儿,然后它又回到Disconnected状态。

任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:26)

问题是您在保存时遇到的错误: Save error: Error Domain=NEVPNErrorDomain Code=4

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

更像这样:

[manager loadFromPreferencesWithCompletionHandler:^(NSError *error) {
     // do config stuff
     [manager saveToPreferencesWithCompletionHandler:^(NSError *error) {
     }];
}];