Se connecter à un VPN par programmation dans iOS 8

Depuis la sortie de iOS 8 bêta, j'ai trouvé une Extension du Réseau dans son ensemble qui va permettre aux développeurs de configurer et se connecter aux serveurs VPN par programme et sans installation du profil.

Le cadre contient une classe importante appelée NEVPNManager. Cette classe possède également 3 méthodes principales qui me permettre d'enregistrer, de charger ou supprimer des préférences VPN. J'ai écrit un bout de code dans la méthode viewDidLoad comme suit:

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);
   }
}];

J'ai aussi placé un bouton de mon point de vue et de définir sa TouchUpInside action à la méthode ci-dessous:

- (IBAction)buttonPressed:(id)sender {
   NSError *startError;
   [[NEVPNManager sharedManager].connection startVPNTunnelAndReturnError:&startError];
   if(startError) {
      NSLog(@"Start error: %@", startError.localizedDescription);
   }
}

Il y a deux problèmes ici:

1) Quand j'essaie d'enregistrer les préférences, l'erreur suivante est générée: Enregistrer d'erreur: Erreur de Domaine=NEVPNErrorDomain Code=4 "L'opération ne pouvait pas être complété. (NEVPNErrorDomain d'erreur 4.)” Quelle est cette erreur? Comment puis-je résoudre ce problème?

2) [[NEVPNManager sharedManager].connexion startVPNTunnelAndReturnError:&startError]; méthode ne retourne aucune erreur quand je l'appelle, mais l'état de la connexion changements de Déconnecté de la Connexion pendant un instant, puis il revient à l'état Déconnecté.

Toute aide sera appréciée 🙂

  • bizarre, quand je suis en cours d'exécution une copie de votre code sur un appareil avec la beta 4 que je suis un nul retourné à partir de [NEVPNManager sharedManager];
  • Ah, je n'avais pas ajouté le "VPN Personnel" droit à mon ID de l'Application ou des droits d'un fichier. Pour ce faire, allez dans "Capacités" dans le cadre du projet
  • Comment allez-vous récupérer le mot de passe du trousseau? J'ai stocké le mot de passe pour mon compte dans le trousseau d'accès, et j'ai essayé de la récupération de la persistance de la référence (qui les docs impliquent sont nécessaires) dans le protocole.passwordReference champ mais encore, elle me demande un mot de passe quand je vais pour vous connecter au VPN de service (une fois que j'entre, je me connecte, donc tout le reste semble bon).
  • L'utilisation de la NEVPNManager classe nécessite la com.apple.developer.networking.vpn.api droit. Vous pouvez obtenir ce droit pour votre application en activant le "VPN Personnel" la capacité de votre application dans Xcode.
  • pourquoi ne pas se connecter vpn gratuit adresse ip objective c