0

我正在将 Android 设备的 VPN 应用程序移植到 iOS(使用NEPacketTunnelProvider)。

Android 为某些 tcp/udp 连接提供了一种绕过 VPN 的机制,使用以下 API:

class VpnService {

  // ...
  
  public boolean protect(int socket) { /* ... */ }

我在 iOS 中看不到等效的 API。如何为 iOS 实现等效的东西?

4

1 回答 1

1

来自 Android 并且对 Apple API(Swift 和 ObjC++ 语言除外)一无所知,我将尝试指出普通开发人员想知道的内容。


iOS 应用程序的生命在视图关闭的那一刻就结束了,因此永久 VPN 服务只能在扩展中实现,这与视图的目标完全不同(因为 iOS 没有服务概念)。

除了了解上述内容之外,还要了解从您的扩展中创建的任何连接(又名 Socket)都被神奇地排除(又名受保护)通过packetFlow(又名隧道)的事实,无论它是由 C/C++ 或Swift5 中的 OOP 包装类。

令人惊讶的是,实际上让你的扩展的套接字通过隧道要困难得多,
你需要使用NEPacketTunnelProvider类的方法:

- createTCPConnectionThroughTunnelToEndpoint:enableTLS:TLSParameters:delegate:

- createUDPSessionThroughTunnelToEndpoint:fromEndpoint:

请注意,上面是实例方法,这就是 ObjC 中减号的含义,
因此仅在扩展上下文中可用(但无论如何,App-targets 都不会从隧道中转义)。

另请参阅:https ://developer.apple.com/forums/thread/94430

于 2021-08-21T16:53:41.300 回答