iOS 学习iOS安全iOS面试题

iOS 使用NetworkExtension创建 VPN(二)

2018-03-05  本文已影响236人  后浪普拉斯

前一篇文章我们只是用了NEVPNManager,使用系统协议创建VPN,而没有使用NETunnelProvider扩展网络核心网络层实现非标准化的私有VPN,接下来我们分析一下这一部分。

NETunnelProviderManager


1、 NETunnelProviderManager 是NEVPNManager 的子类,所以功能上和NEVPNManager 其实相同,它和VPN是一一对应的,我们设置的manager设置成NETunnelProviderManager,而不是NEVPNManager。
2 、我们接下来针对manager设置VPN的配置,此时按照NEKit的shadowsock 的参数来配置manager的protocolConfiguration,和我们之前的配置manager的conf是一样的。
3、 接下来我们还会去保存VPN、监听状态。
4、 打开或者关闭VPN。


在打开或者关闭的时候,如果要使用私有协议的时候就用到了接下来的NEPacketTunnelProvider这个类

NEPacketTunnelProvider

NEPacketTunnelProvider 是VPN的核心代码,项目中我们创建的PacketTunnelProvider是NEPacketTunnelProvider的子类,我们必须实现的两个方法:

- (void)startTunnelWithOptions:(nullable NSDictionary<NSString *,NSObject *> *)options completionHandler:(void (^)(NSError * __nullable error))completionHandler NS_AVAILABLE(10_11, 9_0);  

- (void)stopTunnelWithReason:(NEProviderStopReason)reason completionHandler:(void (^)(void))completionHandler NS_AVAILABLE(10_11, 9_0);

当manager(NETunnelProviderManager)对象调用方法startVPNTunnelWithOptions:andReturnError:时,控制器将会跳转到Extension的startTunnelWithOptions的方法中。

我们看- (BOOL)startVPNTunnelWithOptions:(nullable NSDictionary<NSString *,NSObject *> *)options andReturnError:(NSError **)error NS_AVAILABLE(10_11, 9_0);的参数,第一个参数options:开发者自己定义的信息,第二个参数'completionHandler':block回调。

- (void)stopTunnelWithReason:(NEProviderStopReason)reason completionHandler:(void (^)(void))completionHandler;,reason表示VPN被关闭的理由,第二个参数'completionHandler':block回调。

那我们如何调用Network Extension?

我们在完成PacketTunnel的代码情况下,我们调用Extension的代码。

-4、在手机上再运行应用。

总结:

在使用PacketTunnelProvider中会有使用NEKit的情况,之后需要研究一下NEKit的使用,具体的使用步骤大体相似。

参考:博客Bloodline's Blog 构建 NetworkExtension 应用
github代码lettleprince 的 QLadder 代码

上一篇 下一篇

猜你喜欢

热点阅读