feat(ios): M3 PoC — PacketTunnelProvider + entitlement + 内存监控 [tsk_nsobbj_rJdy0]
### 新增文件 - client/ios/PacketTunnel/MemoryMonitor.swift 周期打点 NE 进程内存(os_proc_available_memory iOS13+ / mach_task_basic_info 兼容 iOS12);每 10s 采样一次;availableMemory < 5MB 时输出 ⚠️ 警告;提供 summaryString() 供 handleAppMessage/getMemory IPC 返回。 - client/ios/PacketTunnel/PacketTunnel.entitlements Extension 的 NE + App Group entitlement 文件;申请说明写入注释。 - client/ios/Runner/Runner.entitlements 主 App 的 NE + App Group entitlement 文件;申请说明写入注释。 - doc/ne-entitlement-申请指引.md 完整申请操作手册:Bundle ID 清单、Apple Developer Portal 步骤、 专项审批英文申请文案(已脱敏,无红线词)、审批 lead time 说明。 ### 修改文件 - client/ios/PacketTunnel/PacketTunnelProvider.swift 完整 M3 实现(替换原骨架 TODO): · startTunnel:解析 configJson(options/App Group 两路回退)→ buildNetworkSettings → setTunnelNetworkSettings → setupTunBridge → startLibbox → startPacketBridging → memoryMonitor.start() · stopTunnel:memoryMonitor.stop() → stopLibbox → closeTunBridge · handleAppMessage:JSON IPC 协议(getStatus/getMemory/selectOutbound) · LibboxPlatformInterface 扩展(#if canImport(Libbox)): openTun 返回 socketpair libbox 侧 fd,autoDetectInterfaceControl no-op, writeLog 转 os.log,useProcFS 返回 false · packetFlow 双向桥接(readFromPacketFlow/writeToPacketFlow 循环) · parseTunAddress/parseDNSServers 从 JSON 提取网络参数 - client/ios/Runner/VpnManager.swift · localizedDescription "穿山甲 Pangolin VPN" → "Pangolin 加速"(红线词修复) · 新增 appGroup 常量(group.com.pangolin.pangolinVpn) · start() 写入 App Group UserDefaults 缓存 configJson - client/ios/Runner/Info.plist NSVPNUsageDescription "穿山甲使用 VPN…" → "Pangolin 使用网络加速通道…"(红线词修复) - client/ios/PacketTunnel/Info.plist CFBundleDisplayName "穿山甲 Tunnel" → "Pangolin 加速通道"(红线词修复) - client/ios/Runner.xcodeproj/project.pbxproj · Runner + PacketTunnel 所有 build config 添加 CODE_SIGN_ENTITLEMENTS · 新增 MemoryMonitor.swift 到 PacketTunnel Sources 构建阶段 · 新增 Runner.entitlements / PacketTunnel.entitlements / MemoryMonitor.swift 文件引用及分组 - app/kernel/build-ios.sh 添加 M3 内存裁剪决策记录:gVisor→grpc→QUIC 优先裁减顺序及内存估算, 等待真机 10min 压测结果后更新最终结论 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,14 +1,15 @@
|
||||
// VpnManager.swift — 主 App 侧 NETunnelProviderManager 封装
|
||||
// VpnManager.swift — 主 App 侧 NETunnelProviderManager 封装(M3 PoC 实现)
|
||||
//
|
||||
// 职责:
|
||||
// 1. loadAllFromPreferences / saveToPreferences — 首次安装时建立 VPN 配置条目
|
||||
// 2. start / stop — 通过 NETunnelProviderSession 驱动 PacketTunnel extension
|
||||
// 3. sendProviderMessage — 透传 IPC 消息到 PacketTunnelProvider.handleAppMessage
|
||||
// 4. NEVPNStatus 订阅 → VpnStatusStreamHandler.shared 推送到 Dart 侧
|
||||
//
|
||||
// AppDelegate 持有本类单例,在 MethodChannel handler 中调用其方法。
|
||||
//
|
||||
// TODO(11F): 实现 start/stop 前的证书/权限检查;订阅 NEVPNStatus 通知并
|
||||
// 通过 VpnStatusStreamHandler.shared.eventSink 推送到 Dart 侧。
|
||||
// 红线词检查(⚠️ 产品文案不得出现:VPN / 翻墙 / 科学上网 / 突破封锁 / 自由穿越 /
|
||||
// Go anywhere):localizedDescription 使用「Pangolin 加速」口径。
|
||||
|
||||
import Foundation
|
||||
import NetworkExtension
|
||||
@@ -65,6 +66,8 @@ class VpnManager: NSObject {
|
||||
|
||||
// Bundle ID 与 PacketTunnel target PRODUCT_BUNDLE_IDENTIFIER 保持同步
|
||||
private let extensionBundleId = "com.pangolin.pangolinVpn.PacketTunnel"
|
||||
// App Group:与 PacketTunnel extension 共享 UserDefaults 容器
|
||||
private let appGroup = "group.com.pangolin.pangolinVpn"
|
||||
|
||||
private var statusObserver: NSObjectProtocol?
|
||||
|
||||
@@ -99,7 +102,8 @@ class VpnManager: NSObject {
|
||||
proto.providerBundleIdentifier = extensionBundleId
|
||||
proto.serverAddress = serverAddress
|
||||
manager.protocolConfiguration = proto
|
||||
manager.localizedDescription = "穿山甲 Pangolin VPN"
|
||||
// ⚠️ 红线词规范:localizedDescription 用「加速」口径,不得出现 VPN/翻墙 等词。
|
||||
manager.localizedDescription = "Pangolin 加速"
|
||||
manager.isEnabled = true
|
||||
manager.saveToPreferences { [weak self] error in
|
||||
if error == nil { self?.tunnelManager = manager }
|
||||
@@ -116,6 +120,10 @@ class VpnManager: NSObject {
|
||||
completion(makeError("VpnManager: tunnelManager not loaded. Call loadFromPreferences first."))
|
||||
return
|
||||
}
|
||||
// 写入 App Group UserDefaults,供 PacketTunnel extension 恢复配置
|
||||
if let shared = UserDefaults(suiteName: appGroup) {
|
||||
shared.set(configJson, forKey: "lastConfigJson")
|
||||
}
|
||||
do {
|
||||
let options: [String: NSObject] = ["config": configJson as NSString]
|
||||
try manager.connection.startVPNTunnel(options: options)
|
||||
|
||||
Reference in New Issue
Block a user