我正在将 Android 设备的 VPN 应用程序移植到 iOS(使用NEPacketTunnelProvider
)。
Android 为某些 tcp/udp 连接提供了一种绕过 VPN 的机制,使用以下 API:
class VpnService {
// ...
public boolean protect(int socket) { /* ... */ }
我在 iOS 中看不到等效的 API。如何为 iOS 实现等效的东西?
我正在将 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 没有服务概念)。
除了了解上述内容之外,还要了解从您的扩展中创建的任何连接(又名 Socket)都被神奇地排除(又名受保护)通过packetFlow
(又名隧道)的事实,无论它是由 C/C++ 或Swift5 中的 OOP 包装类。
令人惊讶的是,实际上让你的扩展的套接字通过隧道要困难得多,
你需要使用NEPacketTunnelProvider
类的方法:
- createTCPConnectionThroughTunnelToEndpoint:enableTLS:TLSParameters:delegate:
- createUDPSessionThroughTunnelToEndpoint:fromEndpoint:
请注意,上面是实例方法,这就是 ObjC 中减号的含义,
因此仅在扩展上下文中可用(但无论如何,App-targets 都不会从隧道中转义)。