iOS 在没有远程服务器的情况下实现 NETunnelProviderProtocol

iOS implementing NETunnelProviderProtocol with no remote server

我正在尝试使用 iOS 的 NetworkExtension 框架实现类似于 Charles for iOS 的数据包嗅探器。

Objective

所以,这是一个很大的目标,我现在将它分解成一个小部分:我想从我的 NEPacketTunnelProvider(图中的底部框)中看到 os_log

到目前为止我做了什么

  1. 我已经在 PacketTunnel 类型上创建了一个 NetworkExtension 目标。这是标题为 "NEPacketTunnelProvider".
  2. 的图表中第三个框中的代码片段
  3. 我在 XCode.
  4. 中包含了 "app groups"、"personal VPN" 和 "Network extension" 功能

问题

我在 Console.app 中查看 os_log("STARTING TUNNEL!!!!") 的输出。当我加载配置并调用 startVPNTunnel() 时,为什么我的 TunnelProvider 代码从未被调用?

我已通过在我的代码中放置一个断点来验证 startVPNTunnel() 被调用。

在startVPNTunnel func中,你应该调用setTunnelNetworkSettings,然后隧道将启动,之后,你可以read/write包。

setTunnelNetworkSettings(nil) {  error in
            pendingStartCompletion(error)
            
 }

您的网络扩展进程可能无法启动的原因有很多:

  1. 我会在 os_log("STARTING TUNNEL!!!!") 上放置一个断点,并在您尝试启动 VPN
  2. 之前通过 Debug -> Attach to Process by PID or Name... 附加到您在 Xcode 中的网络扩展进程
  3. 网络扩展必须扩展包含应用程序的包 ID。例如。如果包含的应用程序是 com.example.vpn 那么网络扩展可能是 com.example.vpn.tunnel.
  4. 确保您的网络扩展 Info.plist 包含 NSExtension 字典,其中 NSExtensionPointIdentifierNSExtensionPrincipalClass 包含 com.apple.networkextension.packet-tunnel 和您的 NEPacketTunnelProvider class(例如 $(PRODUCT_MODULE_NAME).PacketTunnelProvider)。
  5. Packet Tunnel Provider Network Extension 授权是否同时应用于包含应用程序和网络扩展?
  6. 如果您正在实施数据包隧道提供程序,您不想启用 Personal VPN 权利。