loft 在 iPhone 上怎么跑,以后是 Apple TV(tvOS 17+)。目录:clients/iOS/。计划:clients/iOS/PLAN_zh.md(Apple TV 是第 6 阶段)。模型:clients/iOS/design/index.html。协议:protocol_zh.md。导入 URI:share_zh.md。
应用还没做。这份文件是对接规格。
iOS 管隧道什么时候能开(Personal VPN,同时只有一条,On Demand)。Go 引擎管隧道在信道上长什么样。
应用(Safari、邮件、…)
→ Network Extension 拥有的 UTUN
→ NEPacketTunnelProvider (appex app.loft.ios.packet-tunnel)
→ clients/mobile
→ loft Holder (get|ws|h2|quic|h3)
→ SSTP TLS + PPP,IP 来自 IPCP
→ VLESS TCP+TLS
→ 服务器 IP 排除出隧道
容器(app.loft.ios)不说协议。它把 YAML 写进 App Group,然后调 startVPNTunnel。loft、SSTP 和 VLESS 是同一个 provider 的出站。IKEv2 仍是设置里的原装客户端。
活会话之后(loft Status,或 SSTP IPCP)套 NEPacketTunnelNetworkSettings:
| Status | 设置 |
|---|---|
ip / 前缀 |
NEIPv4Settings.addresses |
覆盖网 gateway |
默认路由的 remote address |
mtu |
tunnelOverheadBytes / MTU |
dns |
NEDNSSettings |
ip6 / gateway6 |
有的话用 NEIPv6Settings |
前置 IP 必须放进 excludedRoutes,会话才不会发夹。协议列表映射到 includedRoutes(via)和 excludedRoutes(direct)。drop 是 provider 里丢弃,不是操作系统路由。
不要恢复直连网络对应 includeAllNetworks:会话死了,手机就没有蜂窝/Wi-Fi 路径,直到再打开,或到设置里重置。
Wi-Fi → LTE(反过来也一样)是一条新的默认路径。操作系统适配器调用 NotifyPathChange。loft:关掉当前前置,用新的 0x02 和同一个 instance_id 续上(覆盖网 IP 不变)。SSTP:重新拨 TLS+PPP;若 IPCP 发了新 IP,再套一遍设置。里面的 TCP 还是会 RST。
和 macOS / CLI 的路径切换是同一份约定。不是新能力。Packet Tunnel 里不用 WatchPath(出口会变成覆盖网)。
| 应用 | app.loft.ios |
| Packet Tunnel | app.loft.ios.packet-tunnel |
| App Group | group.app.loft |
| VPN 类型 | Personal VPN(Packet Tunnel) |
Apple Developer 门户:Network Extensions → Packet Tunnel,App Groups。TestFlight 用同一套 id。
引擎(appex + clients/mobile):iOS 15+。SwiftUI 容器:iOS 16+。上传 App Store:Xcode 26 和 iOS 26 SDK;15 是这套工具链还能编的最低 deployment。
URL scheme loft(导入 loft://…)。摄像头扫二维码。照片 / 文件接图片或 .loft(一条或多条连接)。检测器:share_zh.md。
SOCKS5 在 127.0.0.1 上不是入站。别的 iOS 应用没法指向本机 SOCKS,除非走系统 VPN。
IPA 里没有 macOS 的 loft-front 和 loft-priv。