首页 > 解决方案 > Swift 中的 VPN - loadFromPreferences 未运行处理程序

问题描述

我正在尝试以编程方式连接到 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 的正确设置。所以我想那部分已经解决了。但是为什么不调用完成处理程序呢?

标签: swiftmacosvpnipsec

解决方案


推荐阅读