Я пытаюсь программно подключиться к VPN. Я получил код ниже на этом сайте: http://blog.moatazthenervous.com/create-a-vpn-connection-with-apple-swift/
Я пытаюсь разработать приложение командной строки для macOS для программного соединения с VPN.
import Foundation
import NetworkExtension
class VPN {
let vpnManager = NEVPNManager.shared();
let userName: String;
let passString: String;
let secret: String;
let server: String;
init (_ user: String, _ pass: String, _ secret: String, _ server: String){
userName = user
passString = pass
self.secret = secret
self.server = server
}
private var vpnLoadHandler: (Error?) -> Void { return
{ (error:Error?) in
if ((error) != nil) {
print("Could not load VPN Configurations")
return;
}
print ("me! me! ")
let p = NEVPNProtocolIPSec()
p.username = self.userName
p.serverAddress = self.server
p.authenticationMethod = NEVPNIKEAuthenticationMethod.sharedSecret
let kcs = KeychainService();
kcs.save(key: "SHARED", value: self.secret )
kcs.save(key: "VPN_PASSWORD", value: self.passString)
p.sharedSecretReference = kcs.load(key: "SHARED")
p.passwordReference = kcs.load(key: "VPN_PASSWORD")
p.useExtendedAuthentication = true
p.disconnectOnSleep = false
p.localIdentifier = "uio"
self.vpnManager.protocolConfiguration = p
self.vpnManager.localizedDescription = "Contensi"
self.vpnManager.isEnabled = true
self.vpnManager.saveToPreferences(completionHandler: self.vpnSaveHandler)
} }
private var vpnSaveHandler: (Error?) -> Void { return
{ (error:Error?) in
if (error != nil) {
print("Could not save VPN Configurations")
return
} else {
do {
try self.vpnManager.connection.startVPNTunnel()
} catch let error {
print("Error starting VPN Connection \(error.localizedDescription)");
}
}
}
}
public func connectVPN() {
//For no known reason the process of saving/loading the VPN configurations fails.On the 2nd time it works
do {
self.vpnManager.loadFromPreferences(completionHandler: self.vpnLoadHandler)
// self.vpnManager.saveToPreferences(completionHandler: nil)
}
}
public func disconnectVPN() ->Void {
self.vpnManager.connection.stopVPNTunnel()
}
public func status() -> NEVPNStatus {
return vpnManager.connection.status
}
}
Моя проблема в том, что мои обработчики завершения не работают. Возьмем, к примеру, функцию connectVPN()
. Это обработчик завершения vpnLoadHandler
. Тем не менее, я никогда не выполняю этот обработчик. Видите оператор печати на обработчике? Ничего не печатается.
Читая документацию Apple, я знаю, что мне нужно настроить XCode с разрешением, чтобы разрешить VPN - у меня нет таблицы «возможностей», поэтому я не знаю, как добавить это разрешение. Я не уверен, что это проблема, так как приложение компилирует файл и выполняет. Я просто не могу выполнить обработчик завершения.
Итак, в основном:
- почему не вызывается обработчик? И что я могу сделать для отладки?
- Может ли это быть связано с отсутствием разрешения на настройку персонального vpn в xcode? Если так, как я могу это настроить?
Best
Фрэнсис
ОБНОВЛЕНИЕ Мне действительно удалось создать файл разрешений, и я предполагаю, что он имеет надлежащие настройки, чтобы разрешить личный vpn. Так что я думаю, что часть решена. Но почему не вызывается обработчик завершения?