尝试启动 TunnelProvider 网络扩展时出现 NEVPNErrorDomain 错误 1
NEVPNErrorDomain Error 1 when trying to start TunnelProvider network extension
我正在尝试制作自定义 TunnelProvider 网络扩展,方法是从 TunnelProvider 的 XCode 模板开始,然后将代码添加到主机应用程序以配置它并启动它。
我正在使用 NETunnelProviderManager 的实例对其进行配置,当我调用 saveToPreferencesWithCompletionHandler: 时,我获得了成功(错误 = 0)。但是,当我在(非零)连接上调用 startVPNTunnelAndReturnError: 时,我总是会收到以下错误:
Error Domain=NEVPNErrorDomain Code=1 "(null)"
我已经阅读了所有相关的 Apple 文档,并试图让我的程序看起来尽可能接近 SimpleTunnel 测试程序,但是我无法确定为什么我得到这个“1”(这似乎表示配置问题)。
我在网上看到其他几个人也有同样的问题,但没有解决方案。
我拥有所需的特殊权利,我知道这不是问题,因为在使用正确的配置文件后,我能够在 运行 应用程序时看到确认我想要添加 VPN 的弹出窗口,然后它被添加到 VPN 下的设置中。
这是我的代码,以防相关:
NETunnelProviderManager * man = [[NETunnelProviderManager alloc] init];
NETunnelProviderProtocol *protocol = [[NETunnelProviderProtocol alloc] init];
[protocol setServerAddress:@"aaa.bbb.ccc.ddd"]; // not actual value
[protocol setUsername:@"testuser"];
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
NSData *data = [[NSData alloc] init];
[dictionary setObject:@"UUID" forKey:(id)kSecAttrService];
[dictionary setObject:data forKey:(id)kSecValueData];
[dictionary setObject:(__bridge id)kSecAttrAccessibleAlways forKey:(id)kSecAttrAccessible];
[dictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(id)kSecClass];
[dictionary setObject:(__bridge id)kCFBooleanTrue forKey:(id)kSecReturnPersistentRef];
CFTypeRef passwordRef = nil;
OSStatus delStatus = SecItemDelete((__bridge CFDictionaryRef)dictionary);
OSStatus status = SecItemAdd((__bridge CFDictionaryRef)dictionary, &passwordRef);
[protocol setPasswordReference:(__bridge NSData * _Nullable)(passwordRef)];
man.protocolConfiguration = protocol;
man.localizedDescription = @"My VPN";
man.onDemandEnabled = false;
man.enabled = true;
[man saveToPreferencesWithCompletionHandler:^(NSError *err) {
NSLog(@"saved preferences: error = %@", err);
[man.connection startVPNTunnelAndReturnError:&err];
NSLog(@"after start tunnel: error = %@", err);
}];
我发现如果我在尝试启动隧道之前调用 loadFromPreferencesWithCompletionHandler:(但在 saveToPreferencesWithCompletionHandler 之后),这个错误就会消失,我可以让事情继续进行下去。
但是我 运行 在那之后遇到了更多问题。所以暂时我要多分析一下SimpleTunnel程序。
我正在尝试制作自定义 TunnelProvider 网络扩展,方法是从 TunnelProvider 的 XCode 模板开始,然后将代码添加到主机应用程序以配置它并启动它。
我正在使用 NETunnelProviderManager 的实例对其进行配置,当我调用 saveToPreferencesWithCompletionHandler: 时,我获得了成功(错误 = 0)。但是,当我在(非零)连接上调用 startVPNTunnelAndReturnError: 时,我总是会收到以下错误:
Error Domain=NEVPNErrorDomain Code=1 "(null)"
我已经阅读了所有相关的 Apple 文档,并试图让我的程序看起来尽可能接近 SimpleTunnel 测试程序,但是我无法确定为什么我得到这个“1”(这似乎表示配置问题)。
我在网上看到其他几个人也有同样的问题,但没有解决方案。
我拥有所需的特殊权利,我知道这不是问题,因为在使用正确的配置文件后,我能够在 运行 应用程序时看到确认我想要添加 VPN 的弹出窗口,然后它被添加到 VPN 下的设置中。
这是我的代码,以防相关:
NETunnelProviderManager * man = [[NETunnelProviderManager alloc] init];
NETunnelProviderProtocol *protocol = [[NETunnelProviderProtocol alloc] init];
[protocol setServerAddress:@"aaa.bbb.ccc.ddd"]; // not actual value
[protocol setUsername:@"testuser"];
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
NSData *data = [[NSData alloc] init];
[dictionary setObject:@"UUID" forKey:(id)kSecAttrService];
[dictionary setObject:data forKey:(id)kSecValueData];
[dictionary setObject:(__bridge id)kSecAttrAccessibleAlways forKey:(id)kSecAttrAccessible];
[dictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(id)kSecClass];
[dictionary setObject:(__bridge id)kCFBooleanTrue forKey:(id)kSecReturnPersistentRef];
CFTypeRef passwordRef = nil;
OSStatus delStatus = SecItemDelete((__bridge CFDictionaryRef)dictionary);
OSStatus status = SecItemAdd((__bridge CFDictionaryRef)dictionary, &passwordRef);
[protocol setPasswordReference:(__bridge NSData * _Nullable)(passwordRef)];
man.protocolConfiguration = protocol;
man.localizedDescription = @"My VPN";
man.onDemandEnabled = false;
man.enabled = true;
[man saveToPreferencesWithCompletionHandler:^(NSError *err) {
NSLog(@"saved preferences: error = %@", err);
[man.connection startVPNTunnelAndReturnError:&err];
NSLog(@"after start tunnel: error = %@", err);
}];
我发现如果我在尝试启动隧道之前调用 loadFromPreferencesWithCompletionHandler:(但在 saveToPreferencesWithCompletionHandler 之后),这个错误就会消失,我可以让事情继续进行下去。
但是我 运行 在那之后遇到了更多问题。所以暂时我要多分析一下SimpleTunnel程序。