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 lacom.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
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est l'erreur que vous obtenez lors de l'enregistrement:
Save error: Error Domain=NEVPNErrorDomain Code=4
Si vous regardez dans le NEVPNManager.h fichier d'en-tête, vous verrez que le code d'erreur 4 est "NEVPNErrorConfigurationStale". La configuration est obsolète et doit être chargé.
Vous devriez appeler
loadFromPreferencesWithCompletionHandler:
et dans le gestionnaire d'achèvement modifier les valeurs que vous souhaitez modifier, et puis appelsaveToPreferencesWithCompletionHandler:
. L'exemple dans votre question, c'est de modifier la configuration avant le chargement est terminé, c'est pourquoi vous obtenez cette erreur.Plus comme ceci:
prot.authenticationMethod = NEVPNIKEAuthenticationMethod.Certificate; prot.identityData = certificate; prot.identityDataPassword = self._PKCS12CertificatePassword
(code swift)Cette réponse vous sera utile pour ceux qui sont à la recherche de solution à l'aide de l'Extension des réseaux le cadre.
Mon exigence était de connecter/déconnecter du serveur VPN avec le Protocole IKEv2 (bien sûr, vous pouvez utiliser cette solution pour IPSec également par l'évolution de la vpnManager protocolConfiguration)
REMARQUE : Si vous êtes à la recherche pour le Protocole L2TP, à l'Aide d'extension du Réseau de ses pas possible de se connecter un serveur VPN. Reporter : https://forums.developer.apple.com/thread/29909
Voici mon code de travail extrait :
Déclarer VPNManager Objet et d'autres choses utiles
Ajouter observateur dans le viewDidLoad pour obtenir VPN Staus et de stocker vpnPassword dans le Trousseau d'accès, vous pouvez stocker sharedSecret trop qui aurez-vous besoin d'protocole IPSec.
Maintenant dans mon appli a avoir UISwitch de connecter/déconnecter du serveur VPN.
Après avoir cliqué sur l'interrupteur initier tunnel VPN à l'aide de code ci-dessous.
Une fois le VPN a démarré avec succès, vous pouvez changer le statut en conséquence c'est à dire en appelant VPNStatusDidChange
J'ai évoqué ici :
https://stackoverflow.com/a/47569982/3931796
https://forums.developer.apple.com/thread/25928
http://blog.moatazthenervous.com/create-a-vpn-connection-with-apple-swift/
Merci 🙂