gpt4 book ai didi

ios - NEVPNManager 在 Swift 中连接到 VPN

转载 作者:搜寻专家 更新时间:2023-10-31 22:13:12 38 4
gpt4 key购买 nike

我无法找到关于如何执行此操作的明确答案,所以这就是我创建此线程的原因。
我正在开发一个 Swift 应用程序 (Swift 2),我想在其中使用一个函数连接 VPN 服务器。所以我想创建一个

func connect() {
//Handle the connection to the VPN
}

我收到了这个https://gist.github.com/matthijsotterloo/cedf256f7f1c2a9a8f624481b7083afd来自制作 VPN 的开发人员的文件(当然我替换了证书、 key 、url 和登录名。现在我的问题是如何在函数中连接到这个 VPN 服务器?我已经发现我必须使用 NEVPNManager 但我可以真正了解如何构建它。

希望有人能帮助我。

谢谢!

最佳答案

这有点令人困惑,但您使用所需参数设置配置,然后将该配置保存到 NEVPNManager。之后开始 VPN 隧道。

所以你会有这样的东西:

    NEVPNManager.sharedManager().loadFromPreferencesWithCompletionHandler { error in
// setup the config:
let password = vpnAccount!.vpnPassword
let vpnhost = vpnAccount!.vpnHost
let p = NEVPNProtocolIKEv2()
p.username = username
p.localIdentifier = username
p.serverAddress = vpnhost
p.remoteIdentifier = vpnhost
p.authenticationMethod = .None
p.passwordReference = passwordRef
p.useExtendedAuthentication = true
p.serverCertificateIssuerCommonName = vpnhost
p.disconnectOnSleep = false


var rules = [NEOnDemandRule]()
let rule = NEOnDemandRuleConnect()
rule.interfaceTypeMatch = .Any
rules.append(rule)

NEVPNManager.sharedManager().localizedDescription = "My VPN"
NEVPNManager.sharedManager().protocolConfiguration = p
NEVPNManager.sharedManager().onDemandRules = rules
NEVPNManager.sharedManager().onDemandEnabled = true
NEVPNManager.sharedManager().enabled = true
NEVPNManager.sharedManager().saveToPreferencesWithCompletionHandler { error in
guard error == nil else {
print("NEVPNManager.saveToPreferencesWithCompletionHandler failed: \(error!.localizedDescription)")
return
}
VPNManager.sharedManager.startVPNTunnel()
}
}

正确嵌套完成处理程序虽然不明显但很重要:

    loadFromPreferencesWithCompletionHandler{ 
...
saveToPreferencesWithCompletionHandler{
startVPNTunnel
}
}

passwordRef 是:

                let password = vpnAccount!.vpnPassword
vpnAccount!.setPersistenRef(username, password: password!)
let passwordRef = vpnAccount!.persistentRef

vpnAccount.persistentRef 是:

class func persistentRef(_ key: String) -> Data? {
let query: [AnyHashable: Any] = [
kSecClass as AnyHashable: kSecClassGenericPassword,
kSecAttrGeneric as AnyHashable: key,
kSecAttrAccount as AnyHashable: key,
kSecAttrAccessible as AnyHashable: kSecAttrAccessibleAlways,
kSecMatchLimit as AnyHashable: kSecMatchLimitOne,
kSecAttrService as AnyHashable: Bundle.main.bundleIdentifier!,
kSecReturnPersistentRef as AnyHashable: kCFBooleanTrue
]

var secItem: AnyObject?
let result = SecItemCopyMatching(query as CFDictionary, &secItem)
if result != errSecSuccess {
return nil
}

return secItem as? Data
}

我不记得细节但似乎记得上面关于创建 NEVPNManager 正在寻找的引用非常重要。

关于ios - NEVPNManager 在 Swift 中连接到 VPN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39168785/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com