如何在主机应用终止的情况下关闭我的Packet Tunnel Extension

时间:2018-12-11 18:11:20

标签: ios vpn http-proxy networkextension nevpnmanager

现在,我已经使用适用于iOS 11+的网络扩展API实现了一个简单的Packet Tunnel扩展。我希望将其设置为“仅应用程序” VPN,以便可以通过我们的VPN和代理通过“我的应用程序”传输流量。所以,我的问题是

  1. 如何在用户切换到其他应用程序时停止隧道-一种选择是使用应用程序委托方法-(void)applicationWillResignActive:(UIApplication *)application-(void)applicationDidEnterBackground:(UIApplication *)application
  2. 如果用户通过强制退出直接终止了该应用程序,那么VPN也应被关闭-我们可以使用-(void)applicationWillTerminate:(UIApplication *)application,但是当我尝试运行它有时无法正常工作时。
  3. 当应用崩溃时要执行的处理相同情况的内容。 -作为一种解决方法,我正在考虑实现类似乒乓机制的方法,如果应用程序处于活动状态,则它应继续ping或更新可由Packet Tunnel Extension访问的任何共享数据。因此,如果应用程序停止或退出,则Tunnel会知道该应用程序的不活动状态,并且它将自行停止隧道。
  4. 要使VPN隧道保持活动状态,我们需要定期更新令牌,以便有任何方法可以更新VPN首选项并立即反映更改,而无需重新启动(停止并重新启动)隧道。

请针对上述情况提出适当的解决方案或解决方法。这将对我有很大的帮助。

1 个答案:

答案 0 :(得分:0)

我认为您无法在应用程序中以编程方式可靠地实现期望的目标。

您可以将VPN设置为Per-App VPN,并且仅将您的应用与VPN关联。这应该满足您的大多数要求。这样做的限制是只能通过移动设备管理(MDM)解决方案进行部署。

另一种选择是将VPN作为标准VPN运行并通过其建立所有隧道,但是在VPN网络扩展中使用NEPacketTunnelFlow::readPacketObjects(),从NEFlowMetaData获取NEPacket响应,然后使用sourceAppUniqueIdentifier参数来标识您的应用。然后,您可以在网络扩展中对数据包处理进行编码,以便随后可以通过VPN和代理发送来自应用程序的数据,然后可能会将所有其他接收到的数据包转发给其预期的收件人。