swift - 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 - 我没有“功能”-选项卡,所以我不知道如何添加该授权。我不确定这是否是问题所在,因为该应用程序会编译文件并执行。我只是没有让完成处理程序执行。
所以,基本上:
- 为什么不调用处理程序?我能做些什么来调试?
- 这可能是由于缺乏允许在 xcode 中配置个人 vpn 的权利吗?如果是这样,我该如何配置?
最好的,
弗朗西斯
更新我实际上设法创建了权利文件,我猜它具有允许个人 vpn 的正确设置。所以我想那部分已经解决了。但是为什么不调用完成处理程序呢?
解决方案
推荐阅读
- nativescript - Nativescript-Vue 找不到模块'@nstudio/nativescript-mixpanel'
- javascript - IE 11 Script1028 在函数内传播,尝试了 Array.prototype.push.apply
- python-3.x - Python 3 的类型检查工具
- c# - 如何从代码中获取 Windows 索引服务状态?
- firebase - 使用颤振获取 Firestore 中特定文档的大小/字段数
- c# - QuickFIX/n - SSL 启动器(无通道)
- javascript - 函数在 cypress.io 中返回未定义
- hadoop - Hadoop FS:文件及其直接父目录的修改时间差异是否正常?
- alpine.js - 识别 alpine.js for 循环中的最后一项
- java - 为什么这些 application.properties 不起作用?