我正在将Android设备的VPN应用程序移植到iOS(使用NEPacketTunnelProvider
)。
Android为一些tcp/udp连接提供了一种绕过VPN的机制,使用以下API:
class VpnService {
// ...
public boolean protect(int socket) { /* ... */ }
我在iOS中没有看到类似的API。如何在iOS上实现类似的东西?
来自Android并且对Apple API一无所知(除了Swift和objc++语言),我将尝试指出一个普通开发人员想知道的东西。
一个iOS应用程序的生命在视图关闭的那一刻结束,因此永久vpn服务只可能在扩展中,这是一个完全不同的目标,而不是你的视图(因为iOS没有服务的概念)。
除了知道以上,学习的事实,任何连接(又名套接字)创建从您的扩展被神奇地排除(又名保护)从通过packetFlow
(又名隧道),无论它是一个原始套接字由C/c++或OOP-Wrapped类在Swift5。
令人惊讶的是,实际上使您的扩展套接字通过隧道是困难得多,
,你需要使用NEPacketTunnelProvider
类的方法:
- createTCPConnectionThroughTunnelToEndpoint:enableTLS:TLSParameters:delegate:
- createUDPSessionThroughTunnelToEndpoint:fromEndpoint:
注意以上是实例方法,这就是ObjC中的负号的意思,
因此仅在扩展上下文中可用(但无论如何都无法从应用程序目标的隧道中逃脱)。参见:https://developer.apple.com/forums/thread/94430