NEVPNManager Подключение к VPN в Swift
Я не могу найти четкий ответ о том, как это сделать, поэтому я создал эту тему.
Я занимаюсь разработкой приложения Swift (Swift 2), в котором я хочу подключиться к VPN-серверу с помощью функции. Поэтому я хочу создать
func connect() {
//Handle the connection to the VPN
}
Я получил этот https://gist.github.com/matthijsotterloo/cedf256f7f1c2a9a8f624481b7083afd файл от разработчика, который сделал VPN (конечно, я заменил сертификаты, ключи, URL-адреса и логин. Теперь мой вопрос заключается в том, как я могу подключиться к этому VPN-серверу в функция? Я уже узнал, что я должен использовать NEVPNManager, но я не могу понять, как это сделать.
Надеюсь, кто-нибудь может мне помочь.
Спасибо!
1 ответ
Это немного сбивает с толку, но вы настраиваете конфигурацию с нужными параметрами, а затем сохраняете эту конфигурацию в 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.