VPN в Swift - loadFromPreferences не работает обработчик - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь программно подключиться к 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. Так что я думаю, что часть решена. Но почему не вызывается обработчик завершения?

...