"Ошибка домена =NEVPNErrorDomain Code=1 \"(null)\"" При подключении к VPN-серверу
Я получаю сообщение "Ошибка домена =NEVPNErrorDomain Code=1 \"(null)\"" только первый раз при подключении к VPN-серверу, позже это работает отлично.
Я проверил NEVPNErrorDomain Ошибка 1 при попытке запустить расширение сети TunnelProvider, подобное моей проблеме, и следовал тому, как сказано в этом решении, но все еще получал ту же ошибку.
Итак, вот мой код для подключения к VPN-серверу с использованием расширения сети.
func initVPNTunnelProviderManager(){
self.vpnManager.loadFromPreferences { (error) -> Void in
if((error) != nil) {
print("VPN Preferences error: 1")
}
else {
let p = NEVPNProtocolIKEv2()
p.username = "******"
p.remoteIdentifier = "*****"
p.serverAddress = "******"
let keychain = KeychainSwift()
let data = keychain.getData("vpnPassword")
p.passwordReference = data
p.authenticationMethod = NEVPNIKEAuthenticationMethod.none
p.useExtendedAuthentication = true
p.disconnectOnSleep = false
self.vpnManager.protocolConfiguration = p
self.vpnManager.isEnabled = true
self.vpnManager.saveToPreferences(completionHandler: { (error) -> Void in
if((error) != nil) {
print("VPN Preferences error: 2")
}
else {
var startError: NSError?
do {
try self.vpnManager.connection.startVPNTunnel()
}
catch let error as NSError {
startError = error
print(startError)
}
catch {
print("Fatal Error")
fatalError()
}
if((startError) != nil) {
**// Here it comes first time later onwards it goes to else block. (Which I'm expecting first time too)
print("VPN Preferences error: 3")**
let alertController = UIAlertController(title: "Oops..", message:
"Something went wrong while connecting to the VPN. Please try again.", preferredStyle: UIAlertControllerStyle.alert)
alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.default,handler: nil))
self.present(alertController, animated: true, completion: nil)
print(startError)
}
else {
print("Start VPN")
}
}
})
}
}
}
Может ли кто-нибудь помочь мне, почему его первый раз, если идти внутрь, если?
if((startError) != nil) {
// Here is control coming for first time
}
else {
// Which should always come here //later onwards its coming here, not first time.
}
ПРИМЕЧАНИЕ. Я нашел соответствующую публикацию здесь, на GitHub, но если я попробую это решение, это приведет к дополнительной проблеме (Error Domain=NEVPNErrorDomain Code=4 "(null)"), потому что конфигурация устарела и должна быть загружена. Вы должны вызвать loadFromPreferencesWithCompletionHandler: и в обработчике завершения измените значения, которые вы хотите изменить, а затем вызовите saveToPreferencesWithCompletionHandler:.
Заранее спасибо.
2 ответа
Решение:
Повторный вызов loadFromPreferences сразу после saveToPreferences и запуск соединения после завершения загрузки решит проблему. Это так идиотски, как может показаться.
self.vpnManager.saveToPreferences(completionHandler: { (error) -> Void in
if((error) != nil) {
print("VPN Preferences error: 2")
}
else {
self.vpnManager.loadFromPreferences(completionHandler: { (error) in
if((error) != nil) {
print("VPN Preferences error: 2")
}
else {
var startError: NSError?
do {
try self.vpnManager.connection.startVPNTunnel()
}
catch let error as NSError {
startError = error
print(startError)
}
catch {
print("Fatal Error")
fatalError()
}
if((startError) != nil) {
print("VPN Preferences error: 3")
let alertController = UIAlertController(title: "Oops..", message:
"Something went wrong while connecting to the VPN. Please try again.", preferredStyle: UIAlertControllerStyle.alert)
alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.default,handler: nil))
self.present(alertController, animated: true, completion: nil)
print(startError)
}
else {
self.VPNStatusDidChange(nil)
print("Start VPN")
}
}
})
}
})
Для меня сработало это решение:
[self save:settings callback:^(NSError *saveError) {
if (saveError) {
completionHandler(saveError);
HMLog(@"Save config failed [%@]", saveError.localizedDescription);
return;
}
[self.vpnManager loadFromPreferencesWithCompletionHandler:^(NSError *e) { // hack for fix error "NEVPNErrorDomain Code=1"
[self.vpnManager loadFromPreferencesWithCompletionHandler:^(NSError *loadError) {
if (loadError) {
completionHandler(loadError);
return;
}
NSError *a1;
[self.vpnManager.connection startVPNTunnelAndReturnError:&a1];
if (a1) {
completionHandler(a1);
} else
completionHandler(nil);
}];
}];
}];
Просто дважды вызовите loadFromPreferences, после сохранения. Это исправление работает на IOS: 9, 10, 11. Я не знаю почему, но его работа....