С момента выпуска бета-версии iOS 8 я нашел в своем комплекте инфраструктуру расширения сети, которая позволяет разработчикам настраивать и подключаться к VPN-серверам программно и без какой-либо установки профиля.
Структура содержит основной класс NEVPNManager. Этот класс также имеет 3 основных метода, которые позволяют мне сохранять, загружать или удалять настройки VPN. Ive написал кусок кода в методе viewDidLoad следующим образом:
NEVPNManager *manager = [NEVPNManager sharedManager];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(vpnConnectionStatusChanged) name:NEVPNStatusDidChangeNotification object:nil];
[manager loadFromPreferencesWithCompletionHandler:^(NSError *error) {
if(error) {
NSLog(@"Load error: %@", error);
}}];
NEVPNProtocolIPSec *p = [[NEVPNProtocolIPSec alloc] init];
p.username = @"[My username]";
p.passwordReference = [KeyChainAccess loadDataForServiceNamed:@"VIT"];
p.serverAddress = @"[My Server Address]";
p.authenticationMethod = NEVPNIKEAuthenticationMethodCertificate;
p.localIdentifier = @"[My Local identifier]";
p.remoteIdentifier = @"[My Remote identifier]";
p.useExtendedAuthentication = NO;
p.identityData = [My VPN certification private key];
p.disconnectOnSleep = NO;
[manager setProtocol:p];
[manager setOnDemandEnabled:NO];
[manager setLocalizedDescription:@"VIT VPN"];
NSArray *array = [NSArray new];
[manager setOnDemandRules: array];
NSLog(@"Connection desciption: %@", manager.localizedDescription);
NSLog(@"VPN status: %i", manager.connection.status);
[manager saveToPreferencesWithCompletionHandler:^(NSError *error) {
if(error) {
NSLog(@"Save error: %@", error);
}
}];
Я также поместил кнопку на свой взгляд и применил действие TouchUpInside к следующему методу:
- (IBAction)buttonPressed:(id)sender {
NSError *startError;
[[NEVPNManager sharedManager].connection startVPNTunnelAndReturnError:&startError];
if(startError) {
NSLog(@"Start error: %@", startError.localizedDescription);
}
}
Здесь есть две проблемы:
1) Когда я попытаюсь сохранить настройки, будет выведена следующая ошибка: Сохранить ошибку: Ошибка домена = NEVPNErrorDomain Code = 4 "Операция не может быть завершена (ошибка NEVPNErrorDomain 4.)" Что это за ошибка? Как я могу решить эту проблему?
2) [[NEVPNManager sharedManager]. connection startVPNTunnelAndReturnError: & startError]; метод не возвращает никаких ошибок, когда я его вызываю, но статус соединения изменяется с отключенного на соединение в течение всего лишь минуты, а затем возвращается в состояние Disconnected.
Любая помощь будет оценена:)