Невозможно настроить VPN-подключение с помощью Network Extension Framework iOS 8 в Swift

Поэтому я пытался использовать iOS 8 Network Extension Framework для настройки VPN-подключения, когда пользователи нажимают на UIButton. Я использовал следующий учебник: http://ramezanpour.net/post/2014/08/03/configure-and-manage-vpn-connections-programmatically-in-ios-8/

Но по какой-то причине он продолжает просить пароль vpn и общий секрет. Даже если я установил парольReference и sharedSecretReference. И если я введу эти данные при установке профиля, он все равно не будет работать. Он просто ничего не делает при запуске соединения с использованием фреймворка. При попытке подключения с помощью приложения настроек оно дает ошибку «нет sharedSecret».

Это код, который я использую для настройки соединения.

func toggleConnection(sender: UIButton) { if(!self.connected){ self.manager.loadFromPreferencesWithCompletionHandler { (error) -> Void in if((error) != nil) { println("VPN Preferences error: 1") } else { var p = NEVPNProtocolIPSec() p.username = "$username" p.serverAddress = "$vpn" p.passwordReference = KeychainService.dataForKey("vpnPassword")! println(p.passwordReference) p.authenticationMethod = NEVPNIKEAuthenticationMethod.SharedSecret p.sharedSecretReference = KeychainService.dataForKey("sharedSecret")! println(p.sharedSecretReference) p.localIdentifier = "vpn" p.remoteIdentifier = "vpn" p.disconnectOnSleep = false self.manager.`protocol` = p self.manager.onDemandEnabled = true self.manager.localizedDescription = "VPN" self.manager.saveToPreferencesWithCompletionHandler({ (error) -> Void in if((error) != nil) { println("VPN Preferences error: 2") println(error) } else { var startError: NSError? self.manager.connection.startVPNTunnelAndReturnError(&startError) if((startError) != nil) { println("VPN Preferences error: 3") println(startError) } else { println("Start VPN") } } }) } } } } 

Это функции, которые я использую в качестве ссылки для связки ключей.

 class func save(service: NSString, key: String, data: NSString) { var dataFromString: NSData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! var keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPassword, service, key, dataFromString], forKeys: [kSecClass, kSecAttrService, kSecAttrAccount, kSecValueData]) SecItemDelete(keychainQuery as CFDictionaryRef) if data == "" { return } var status: OSStatus = SecItemAdd(keychainQuery as CFDictionaryRef, nil) println(status) } class func load(service: NSString, key: String) -> NSData? { var keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPassword, service, key, kCFBooleanTrue, kSecMatchLimitOne, kCFBooleanTrue], forKeys: [kSecClass, kSecAttrService, kSecAttrAccount, kSecReturnData, kSecMatchLimit, kSecReturnPersistentRef]) var dataTypeRef :Unmanaged<AnyObject>? let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef) println(status) if (status != errSecSuccess) { return nil } let opaque = dataTypeRef?.toOpaque() var contentsOfKeychain: NSData? = nil if let op = opaque { let retrievedData = Unmanaged<NSData>.fromOpaque(op).takeUnretainedValue() contentsOfKeychain = retrievedData } println(contentsOfKeychain) return contentsOfKeychain } 

Любая помощь приветствуется!

Поэтому мне пришлось в конечном итоге заменить библиотеку Swift, которую я использовал для доступа к цепочке ключей со следующими методами Obj-C. Это решило мою проблему, насколько я могу сейчас рассказать.

 + (void) storeData: (NSString * )key data:(NSData *)data { NSLog(@"Store Data"); NSMutableDictionary * dict = [[NSMutableDictionary alloc] init]; [dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; NSData *encodedKey = [key dataUsingEncoding:NSUTF8StringEncoding]; [dict setObject:encodedKey forKey:(__bridge id)kSecAttrGeneric]; [dict setObject:encodedKey forKey:(__bridge id)kSecAttrAccount]; [dict setObject:@"VPN" forKey:(__bridge id)kSecAttrService]; [dict setObject:(__bridge id)kSecAttrAccessibleAlwaysThisDeviceOnly forKey:(__bridge id)kSecAttrAccessible]; [dict setObject:data forKey:(__bridge id)kSecValueData]; OSStatus status = SecItemAdd((__bridge CFDictionaryRef)dict, NULL); if(errSecSuccess != status) { NSLog(@"Unable add item with key =%@ error:%d",key,(int)status); } } + (NSData *) getData: (NSString *)key { NSMutableDictionary * dict = [[NSMutableDictionary alloc] init]; [dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; NSData *encodedKey = [key dataUsingEncoding:NSUTF8StringEncoding]; [dict setObject:encodedKey forKey:(__bridge id)kSecAttrGeneric]; [dict setObject:encodedKey forKey:(__bridge id)kSecAttrAccount]; [dict setObject:@"VPN" forKey:(__bridge id)kSecAttrService]; [dict setObject:(__bridge id)kSecAttrAccessibleAlwaysThisDeviceOnly forKey:(__bridge id)kSecAttrAccessible]; [dict setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; [dict setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnPersistentRef]; CFTypeRef result = NULL; OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)dict,&result); if( status != errSecSuccess) { NSLog(@"Unable to fetch item for key %@ with error:%d",key,(int)status); return nil; } NSData *resultData = (__bridge NSData *)result; return resultData; } 
  • iOS 7 программно для каждого приложения VPN
  • Приложение iOS с пользовательским подключением VPN
  • Правила NetworkExtension connectOnDemand не работают
  • loadFromPreferencesWithCompletionHandler: не вызывается
  • OpenVPN по запросу, как указать количество проб для отказа?
  • NEVPNManager в OSX 10.11 - как настроить VPN-соединение IKEV2
  • Как проверить подключение VPN в iPhone
  • Почему трафик не проходит должным образом через провайдера туннелей расширения сети iOS?
  • Получение списка установленных профилей VPN программно - iOS
  • как обнаружить VPN-соединение iphone?
  • Можно ли использовать протокол SSL с NEVPNManager (и без использования API NETunnelProvider)
  • Давайте будем гением компьютера.