首页 > 解决方案 > 如何通过终止主机应用程序关闭我的数据包隧道扩展

问题描述

现在我已经使用 iOS 11+ 的网络扩展 API 实现了一个简单的数据包隧道扩展。我想让它成为仅限应用程序的 VPN,以便来自我的应用程序的流量可以通过我们的 VPN 和代理进行隧道传输。所以,我的问题是

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

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

标签: iosvpnhttp-proxynetworkextensionnevpnmanager

解决方案


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

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

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


推荐阅读