【发布时间】:2014-09-18 04:00:36
【问题描述】:
自 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) 当我尝试保存首选项时,会抛出以下错误: Save error: Error Domain=NEVPNErrorDomain Code=4 "The operation could not be completed. (NEVPNErrorDomain error 4.)”这是什么错误? 我该如何解决这个问题?
2) [[NEVPNManager sharedManager].connection startVPNTunnelAndReturnError:&startError];方法在我调用它时不会返回任何错误,但是连接状态会从 Disconnected 更改为 Connecting 片刻,然后又回到 Disconnected 状态。
任何帮助将不胜感激:)
【问题讨论】:
-
奇怪,当我在带有 beta 4 的设备上运行您的代码副本时,我从 [NEVPNManager sharedManager] 返回 nil;
-
啊,我没有在我的 App ID 或权利文件中添加“个人 VPN”权利。为此,请转到项目下的“功能”
-
您如何从钥匙串中检索密码?我已将我帐户的密码存储在钥匙串中,并且我尝试将持久引用(文档暗示这是必要的)检索到 protocol.passwordReference 字段中,但是当我连接到时它仍然提示我输入密码VPN 服务(一旦我进入它,我就会连接,所以其他一切看起来都很好)。
-
使用
NEVPNManager类需要com.apple.developer.networking.vpn.api权利。您可以通过在 Xcode 中为您的应用启用“个人 VPN”功能来为您的应用获取此权利。 -
为什么不连接免费的 vpn ip address 目标 c
标签: ios objective-c ios8 vpn