我面临一个大问题,我为IOS设备制作了一个VPN,它在appstore上,运行良好,但是我在macOS应用程序中遇到了问题,我使用了相同的代码。相同的代码适用于IOS设备,但它们却没有适用于MacOS应用程序。
问题说; 没有提供VPN共享密码。验证您的设置,然后尝试重新连接。
当我尝试连接到VPN时。
我用于连接VPN的代码
[[NEVPNManager sharedManager] loadFromPreferencesWithCompletionHandler: ^(NSError *error) {
NEVPNProtocolIPSec *p = [[NEVPNProtocolIPSec alloc] init];
p.serverAddress =ipAddress;
p.authenticationMethod = NEVPNIKEAuthenticationMethodSharedSecret;
NSLog(@"vpn connecting to ip %@",ipAddress);
p.username=@"vpnuser";
p.sharedSecretReference = [KeyChainHelper load:sharedSecret];
p.passwordReference = [KeyChainHelper load:password];
// NSData * data = [self searchKeychainCopyMatching:sharedSecret];
p.disconnectOnSleep = NO;
[NEVPNManager sharedManager].protocolConfiguration=p;
NSMutableArray *rules = [[NSMutableArray alloc] init];
NEOnDemandRuleConnect *connectRule = [NEOnDemandRuleConnect new];
[rules addObject:connectRule];
[[NEVPNManager sharedManager] setOnDemandRules:rules];
[[NEVPNManager sharedManager] setLocalizedDescription:@"VPN Fire"];
[[NEVPNManager sharedManager] setEnabled:YES];
[[NEVPNManager sharedManager] saveToPreferencesWithCompletionHandler: ^(NSError *error) {
NSLog(@"Save VPN to preference complete");
if (error) {
NSLog(@"Save error: %@", error);
}
NSError *startError;
[[NEVPNManager sharedManager].connection startVPNTunnelAndReturnError:&startError];
delayStart(5)
NSLog(@"%@",[NEVPNManager sharedManager]);
NSLog(@"%@",[NEVPNManager sharedManager]);
delayEnd
if(startError) {
NSLog(@"Start error: %@", startError.localizedDescription);
}
}];
}];
我在这里放了一些屏幕快照;
答案 0 :(得分:0)
看起来KeyChainHelper
是用于访问钥匙串的包装器。目前尚不清楚KeyChainHelper::load()
方法返回什么,但是我猜测是 standard 引用还是数据。
NEVPNProtocolIPSec::sharedSecretReference
定义为:
对包含IKE共享机密的钥匙串项的持久钥匙串引用。
您需要创建kSecClassGenericPassword
类型的钥匙串项目以用作共享密钥,并为钥匙串项目提供 永久引用 。持久引用在这里至关重要,因为持久引用可以存储到磁盘或在进程之间传递,NEVPNManager
才能访问共享密钥并连接VPN。密码参考也是如此。
您将需要使用SecItemCopyMatching
和返回类型kSecReturnPersistentRef
来实现此目的。您的KeyChainHelper
类可以提供一种返回持久引用的方法。