NEVPNErrorDomain Ошибка 1 при попытке запустить расширение сети TunnelProvider
Я пытаюсь создать собственное сетевое расширение TunnelProvider, начав с шаблона XCode для TunnelProvider, а затем добавив код в приложение хоста, чтобы настроить его и запустить.
Я использую экземпляр NETunnelProviderManager для его настройки, и когда я вызываю saveToPreferencesWithCompletionHandler: я получаю успех (error = 0). Однако, когда я вызываю startVPNTunnelAndReturnError: на (ненулевом) соединении я всегда получаю ошибку ниже:
Ошибка домена =NEVPNErrorDomain Code=1 "(ноль)"
Я прочитал всю связанную с 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);
}];
1 ответ
Я обнаружил, что если я вызываю loadFromPreferencesWithCompletionHandler: перед тем, как пытаться запустить туннель (но после saveToPreferencesWithCompletionHandler), эта ошибка исчезает, я могу заставить вещи идти немного дальше.
Однако после этого у меня возникают другие проблемы. Итак, пока я собираюсь проанализировать программу SimpleTunnel немного подробнее.