merge: iOS 端 PoC M3 + entitlement 申请 [tsk_F5r4Kt9m_wQU]

解决合并冲突(原任务 tsk_nsobbj_rJdy0 分支 maestro/tsk_nsobbj_rJdy0):
两分支修改文件集合无重叠,手动 apply iOS PoC commit (e129f09)。

变更内容:
- client/ios/PacketTunnel/PacketTunnelProvider.swift:完整 M3 实现
  (startTunnel/stopTunnel/handleAppMessage/LibboxPlatformInterface)
- client/ios/PacketTunnel/MemoryMonitor.swift:新增 NE 进程内存打点
- client/ios/PacketTunnel/PacketTunnel.entitlements:NE + App Group 权限
- client/ios/Runner/Runner.entitlements:主 App NE + App Group 权限
- client/ios/Runner/VpnManager.swift:红线词修复 + App Group 缓存 + NEVPNStatus 订阅
- client/ios/Runner/Info.plist:NSVPNUsageDescription 红线词修复
- client/ios/PacketTunnel/Info.plist:CFBundleDisplayName 红线词修复
- client/ios/Runner.xcodeproj/project.pbxproj:
  CODE_SIGN_ENTITLEMENTS 添加到全部 build config;MemoryMonitor 加入 Sources
- app/kernel/build-ios.sh:M3 内存裁剪决策记录
- doc/ne-entitlement-申请指引.md:新增 NE entitlement 申请完整指引

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-13 20:14:32 +08:00
parent 628440b3f9
commit 7a1715bd09
10 changed files with 889 additions and 41 deletions
+12 -4
View File
@@ -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 anywherelocalizedDescription 使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)