iOS - 开发之VPN

因为苹果的限制,连接到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:p];

我们必须设置的最后一件事是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连接。

时间: 2024-12-11 14:35:48

iOS - 开发之VPN的相关文章

IOS开发之copy的问题

copy的目的就是修改副本,修改原始对象和副本时不会产生干扰. 定义一个不可变属性A,再定义一个可变属性B.用B做添加删除等操作后再将B赋值给A时,有些人习惯用A = B:其实这样是不安全的. 假设有下面的一段代码: ? 1 2 3 4 5 6 7 8 9 10   int main() {    NSMutableString *strM = [NSMutableString [email protected]"123"];    NSString *str = strM;    N

iOS开发之WKWebView简单使用和常用使用场景

iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版.本着对新事物的好奇,就上网查了一下,但是找了好多个都没说的多了详细,于是就问谷歌,找文档,看看使用方法,试用了一下,果然不错,记录下来,大家分享! WKWebView的特点: 性能高,稳定性好,占用的内存比较小, 支持JS交互 支持HTML5 新特性 可以添加进度条(然并卵,不好用,还是习惯第三方的). 支持内建手势, 据说高达60fps的刷

iOS开发之Auto Layout入门

随着iPhone6与iOS8的临近,适配的问题讲更加复杂,最近学习了一下Auto Layout的使用,与大家分享.  什么是Auto Layout? Auto Layout是iOS6发布后引入的一个全新的布局特性,其目的是弥补以往Autoresizing在布局方面的不足之处,以及未来面对更多尺寸适配时界面布局可以更好的适应. 为什么要用Auto Layout? Autolayout能解决不同屏幕(iPhone4,iPhone5,iPad...)之间的适配问题. 在iPhone4时代开发者只需要适

iOS开发之CocoaPods的使用

透明色:00ff00ff //设置柱状图的颜色                ColorSet cs = new ColorSet();                cs.Id = "colorset1"; #region 设置柱状图的颜色 待开发                    string strColor = oYAXIS.Color;                    switch (strColor)                    {           

iOS开发之UILabel

UILabel是iOS开发中常用的一个组件,主要用来显示内容. UILabel的主要使用如下: ? 1 2 3 4 5 6 7 8 9 10 /*尺寸*/ CGRect labelRect = CGRectMake(100, 100, 80, 40); /*初始化*/ UILabel *titleLabel = [[UILabel alloc] initWithFrame:labelRect]; /*一些属性的设置*/ titleLabel.font = [UIFont systemFontOf

iOS开发之多XIB之间相互关联

Xib link Xib 1.直接加载xib中的UIView 创建一个View1.xib, 随便设一个背景色,加一个标识UILabel, 这样好知道是这个view是哪一个view. 你可以在这个view上加作意的subview,我只是说明原理,所以这儿并没有加作何subview. 最终我的View1如下图: 由于View1会放到其它View上作为subview,所以这儿size是Freeform, Status Bar是:None. 将下面代码放到viewDidLoad中: &1这行代码就是加载

iOS开发之UISearchBar初探

iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开发需求.比如:修改placeholder的颜色.修改UISearchBar上面的UITextfield的背景颜色.修改UITextfield上面的照片等等. 为了实现上述的需求,最好写一个UISearchBar的子类就叫LSSearchBar吧 LSSearchBar.h如下: #import <U

iOS开发之MVVM在项目中的应用

今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦~). 由于本人项目经验有限,关于架构设计方面的东西理解有限,我个人对MVVM的理解主要是借鉴于之前的用过的MVC的Web框架~在学校的时候用过ThinkPHP框架,和SSH框架,都是MVC的架构模式,今天MVVM与传统的MVC可谓是极为相似,也可以说是兄弟关系,也就是一家人了. 说到架构设计和团队

iOS开发之int,NSInteger,NSUInteger,NSNumber的使用

1.首先先了解下NSNumber类型: 苹果官方文档地址:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html NSNumber是NSValue的一个子类,它是一个对象来存储数字值包括bool型,它提供了一系列的方法来存储char a signed or unsigned char, short