iOS开发之VPN

来源:互联网 发布:北京亚信智慧数据 编辑:程序博客网 时间:2024/06/05 23:42

转自:http://www.mamicode.com/info-detail-1166644.html


因为苹果的限制,连接到VPN服务器编程一直是作为开发人员的一个不可能完成的任务。但是现在苹果推出了全新的网络扩展框架使开发人员可以以编程的方式配置VPN。

这篇文章是一个指南来管理VPN配置在iOS 8和OS X(10.10)以上版本。

1.需要一个iOS8以上测试机,因为这个测试不工作在模拟器上。

2.你需要改变你的配置文件。你不能用你的iOS 7开发iOS 8 VPN应用程序配置概要文件。

然后登录到你的开发人员帐户,然后点击“证书标识符&档案”:

通过iOS 8的引入,一个新条目添加到这个列表“VPN配置和控制”。这正是我们在寻找的!所以启用这个特性通过点击它然后定时复选框。当你打开一个模态窗口将显示该特性,描述了它的功能:

启用VPN配置和控制特性,然后单击“完成”。然后,再次下载配置文件和替换旧的。然后让我们回到Xcode。

打开Xcode,创建一个新的iOS 8单一视图应用程序项目。然后,按钮在屏幕的中间,然后将它连接到你的ViewController。我们要做的就是设置VPN偏好viewDidLoad:方法,然后连接到我们指定的VPN服务器当按钮被点击。

在开始之前,你必须知道这一切工作!如果你理解网络扩展框架的结构,那么它将会更容易在此基础上开发应用程序。

NetworkExtension.framework苹果公司发展中这个框架做了出色的工作。

每一个应用程序可以访问系统偏好,但在自己的沙盒;这意味着你不能访问其他应用程序的沙箱。

首先,必须载入保存偏好从操作系统能够被访问。一旦加载,可以让你改变。改变了之后,他们需要保存。未保存的偏好并不适用。应用程序的偏好也可以删除如果你不再需要他们。

因此,创建一个VPN配置,我们需要做到以下几点:加载应用程序的首选项让我们改变保存参数。

注意,您需要加载应用程序的喜好,即使你还没有设置任何配置。创建VPN连接后我们可以连接或断开。网络扩展包含三个主要类别:NEVPNManagerNEVPNProtocolNEVPNConnection在这个框架NEVPNManager是最重要的类。它负责加载、保存和删除偏好。事实上,所有VPN任务需要通过这门课。

创建一个新的VPN连接开始创建这个类的一个新实例:

NEVPNManager *manager = [NEVPNManager sharedManager];

NEVPNManager初始化后,系统设置可以使用loadFromPreferencesWithCompletionHandler:加载方法:

[manager loadFromPreferencesWithCompletionHandler:^(NSError *error) {    // Put your codes here...}];

正如我提到的在上面的代码中,加载方法接受一个编译处理程序块。这一块触发加载过程完成。这一块也有一个参数是一个NSError。NSError参数将是零,如果加载操作完成;否则,它将非nil。因此:

[manager loadFromPreferencesWithCompletionHandler:^(NSError *error) {    if(error) {        NSLog(@"Load error: %@", error);    } else {        // No errors! The rest of your codes goes here...    }}];

加载过程完成后,是时候建立VPN连接了。

iOS 8支持两种主要的协议。IPSec和IKEv2。这是第一次,苹果提供IKEv2协议在其操作系统。该协议支持所有主流操作系统包括Android、Windows Phone,Windows桌面,Linux现在iOS和Mac。在这篇文章中我将讨论IPSec和在我的下一个职位我将谈论IKEv2。除了这些协议,苹果使您能够创建自己的协议如果需要!这个特性是一个非常重要的特性对于那些实现了他们自己的协议,因为现在可以实现在iOS和Mac协议。好吧,允许设置IPSec协议:

NEVPNProtocolIPSec *p = [[NEVPNProtocolIPSec alloc] init];p.username = @"[Your username]";p.passwordReference = [VPN user password from keychain];p.serverAddress = @"[Your server address]";p.authenticationMethod = NEVPNIKEAuthenticationMethodSharedSecret;p.sharedSecretReference = [VPN server shared secret from keychain];p.localIdentifier = @"[VPN local identifier]";p.remoteIdentifier = @"[VPN remote identifier]";p.useExtendedAuthentication = YES;p.disconnectOnSleep = NO;

在第一行中,我创建了一个新的NEVPNProtocolIPSec的实例。这个类是继承自NEVPNProtocol类。NEVPNProtocol类是一个抽象类可以使用它创建自己的协议。

然后,我们指定的用户名和密码在第二和第三行。注意密码是一个引用从钥匙链;因此,您需要将你的密码存储在钥匙链,然后检索它。

第四行是我们的服务器地址。可以一个IP服务器地址,主机名称或URL。

下一个是身份验证方法。

iOS 8支持三种身份验证方法NEVPNIKEAuthenticationMethodNone:不要使用IPSec服务器进行身份验证。NEVPNIKEAuthenticationMethodCertificate:使用证书和私钥作为身份验证凭据。NEVPNIKEAuthenticationMethodSharedSecret:使用共享密钥的身份验证凭据。

正如你所看到的,我使用共享密钥方法;但是,您可以使用任何你想要的方法。下一行是共享秘密参考。再次引用从钥匙链,所以,你需要共享的秘密。如果你要使用证书而不是共享的秘密。没有必要填补sharedSecretReference财产;相反,您必须填补identityData财产。身份数据是VPN的PKCS12数据验证身份。这个属性的值必须是一个NSData PKCS12格式:

p.identityData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"clientCert" ofType:@“p12"]];

接下来的两行是本地和远程标识符。这两个是字符串识别本地和远程IPSec端点进行身份验证。我们需要设置useExtendedAuthetication第二属性。这是一个标志指示如果扩展验证将协商。这个认证是除了艾克验证用于验证的端点艾克会话。艾克版本1,当这个标志设置X-Auth认证将谈判作为艾克会话的一部分,使用用户名和密码属性作为凭证。艾克版本2,当这个标志设置EAP认证将谈判作为艾克会话的一部分,使用用户名、密码,和/或身份属性证书,这取决于EAP服务器需要方法。

最后一个属性设置disconnectOnSleep。这个布尔表示是否VPN连接时,必须断开设备睡觉。好足够的协议。接下来我们要做的就是将我们刚刚创建的协议分配给VPN经理。为此,可以使用setProtocol:方法。

 [manager setProtocol:p];

IPSec和IKEv2协议有一个很酷的特性称为随需应变。这个特性使连接到连接自动当用户试图连接到互联网。在iOS 8中,可以实现按需连接。但是,我要介绍这一特性在另一篇文章,因此,让让它现在的不会设置onDemandEnabled属性。

[manager setOnDemandEnabled:NO];

我们必须设置的最后一件事是VPN的描述我们要创建的偏好。这样做,只是用setLocalizedDescription设置本地化描述属性:方法

[manager setLocalizedDescription:@"[You VPN configuration name]”];

我们几乎完成了。我们设置的配置但还没有保存它。

保存配置

简单地调用saveToPreferencesWithCompletionHandler:方法:

[manager saveToPreferencesWithCompletionHandler:^(NSError *error) {    if(error) {        NSLog(@"Save error: %@", error);    }    else {        NSLog(@"Saved!");    }}];

这个方法简单地保存你的指定配置系统设置。

连接

连接你刚刚创建的VPN到系统偏好设置。NEVPNManager有一个属性被称为连接。这个属性是NEVPNConnection类的一个对象。它持有负责VPN连接的信息。连接到您刚刚创建VPN服务器,只是叫startVPNTunnelAndReturnError:NEVPNConnection类的方法就像下图:你设备上运行应用程序,你会看到和新的连接将创建和你可以点击这个按钮连接到它。另外,您可以通过编程方式从VPN服务器断开以及通过调用stopVPNTunnel NEVPNConnection方法:

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

连接到我们刚刚创建的VPN连接。

0 0
原创粉丝点击