PacketTunnelProvider.swift (核心逻辑文件)
📋 基本设置:
- 文件名:PacketTunnelProvider.swift
- 继承:NEPacketTunnelProvider类
- 导入框架:NetworkExtension, Libbox, os.log
- 类属性:包含一个LibboxBoxService可选变量
🔧 核心功能实现:
1. 重写startTunnel异步方法:
- 接收options参数字典
- 记录详细启动日志和时间戳
- 创建工作目录和缓存目录(使用系统临时目录)
- 初始化Libbox环境(LibboxSetup调用)
- 读取VPN配置数据(内置VLESS配置)
- 创建并启动sing-box服务
- 包含完整错误处理
2. 重写stopTunnel方法:
- 记录停止原因
- 清理boxService资源
- 调用completionHandler
3. 辅助方法实现:
- getWorkingDirectory:返回系统临时目录下的sing-box文件夹
- getCacheDirectory:返回系统临时目录下的sing-box-cache文件夹
- getConfigurationData:返回内置的VLESS配置JSON数据
📡 VLESS配置要求:
- 服务器地址:xxx.xxx.xxx.xxx
- 端口:18938
- UUID:73452918-6180-42da-ba07-874xxbc061xx
- 包含中国IP智能分流规则(中国IP走代理,其他直连)
- DNS配置:谷歌DNS走代理,国内DNS直连
- TUN接口配置:172.19.0.1/30
🐛 错误处理:
- LibboxSetup失败处理
- 服务创建失败处理
- 目录创建失败处理
- 详细的NSLog日志记录(使用emoji标记不同级别)
⚠️ 重要注意:
- 不使用App Group,全部使用系统临时目录
- 包含详细的中文日志输出
- 异步方法使用async/await语法
- 完整的资源清理机制
PlatformInterface.swift (Libbox平台接口文件)
请创建一个Libbox平台接口实现文件,要求如下:
📋 基本设置:
- 文件名:PlatformInterface.swift
- 导入框架:Foundation, Libbox, NetworkExtension
- 类声明:继承NSObject,实现LibboxPlatformInterfaceProtocol协议
- 初始化:接收NEPacketTunnelProvider实例
🔧 核心协议方法实现:
1. openTun方法:
- 接收LibboxTunOptions和返回指针参数
- 创建NEPacketTunnelNetworkSettings网络配置
- 设置TUN接口MTU、DNS服务器(8.8.8.8, 8.8.4.4)
- 配置IPv4地址和子网掩码(默认10.0.0.2/255.255.255.0)
- 设置路由规则(优先使用配置的路由,默认全局路由)
- 同步应用网络设置到系统
- 获取TUN文件描述符并返回
2. 平台特性方法:
- usePlatformAutoDetectControl:返回false
- underNetworkExtension:返回true(关键设置)
- usePlatformDefaultInterfaceMonitor:返回false
- useGetter:返回false
- useProcFS:返回false
3. 日志和通知方法:
- writeLog:使用NSLog输出Libbox日志
- clearDNSCache:iOS不需要实现
- send:通知方法不需要实现
4. 未实现方法:
- autoDetectControl:抛出"不支持"错误
- findConnectionOwner:抛出"iOS不支持"错误
- packageName/uid相关:返回空或抛出错误
- 网络接口相关:抛出"使用默认"错误
📡 网络配置细节:
- 隧道远程地址:127.0.0.1
- 默认IPv4地址:10.0.0.2
- 默认子网掩码:255.255.255.0
- DNS服务器:8.8.8.8, 8.8.4.4
- 支持IPv4路由迭代器配置
🔄 同步执行工具:
- 实现runBlocking函数:将异步操作转换为同步执行
- 使用DispatchSemaphore进行线程同步
- 支持泛型返回值和错误传播
⚠️ 重要注意:
- underNetworkExtension方法必须返回true
- 网络设置应用必须使用同步方式
- 包含详细的中文调试日志
- 完整的错误处理和参数验证
AppDelegate.swift (iOS主应用+MethodChannel文件)
请创建iOS主应用的AppDelegate类,集成管理和Flutter通信,要求如下:
📋 基本设置:
- 文件名:AppDelegate.swift
- 导入框架:Flutter, UIKit, NetworkExtension
- 类声明:继承FlutterAppDelegate,添加@main和@objc标记
- 属性:包含NETunnelProviderManager可选变量
🔧 应用生命周期:
1. application didFinishLaunchingWithOptions方法:
- 调用loadVPNManager初始化VPN管理器
- 获取FlutterViewController实例
- 创建名为"vpn_channel"的MethodChannel
- 注册handleVPNMethodCall作为方法处理器
- 记录MethodChannel注册成功日志
- 调用GeneratedPluginRegistrant.register
- 返回super调用结果
🔧 VPN管理功能:
1. loadVPNManager方法:
- 使用NETunnelProviderManager.loadAllFromPreferences加载现有配置
- 如果找到配置则保存管理器实例
- 如果没有配置则记录需要创建新配置的日志
- 包含错误处理和日志记录
2. MethodChannel处理器:
- requestPermission:创建新的NETunnelProviderManager并保存配置
- startVPN:启动VPN隧道连接
- stopVPN:停止VPN连接
- getStatus:获取当前VPN状态
- 未知方法:返回FlutterMethodNotImplemented
📡 VPN配置参数:
- providerBundleIdentifier:com.example.singflutterClean.VPNExt
- serverAddress:VLESS Proxy Server
- username:SingBox
- providerConfiguration字典:包含服务器地址、端口、UUID等参数
- localizedDescription:SingBox VPN
- isEnabled:true
🔄 状态管理:
1. VPN状态翻译(NEVPNStatus到中文):
- invalid → "无效"
- disconnected → "未连接"
- connecting → "连接中"
- connected → "已连接"
- reasserting → "重新连接中"
- disconnecting → "断开中"
🐛 错误处理:
1. NEVPNErrorDomain详细错误码处理:
- 错误码1:配置无效
- 错误码2:配置被禁用
- 错误码3:连接失败
- 错误码4:配置过期
- 错误码5:读写失败
- 错误码6:未知错误
2. Flutter错误返回:
- 使用FlutterError包装错误信息
- 包含错误码、消息和详细描述
- 中文错误提示
⚠️ 重要注意:
- 必须使用NETunnelProviderManager而非NEVPNManager
- saveToPreferences会触发系统权限对话框
- 所有网络操作都要异步处理
- 包含详细的中文日志输出
- 完整的错误处理和回调机制
核心步骤
1. 用户点击"请求权限"
→ NETunnelProviderManager().saveToPreferences()
→ 系统弹出权限对话框
2. 用户允许权限后,点击"连接"
→ vpnManager.connection.startVPNTunnel()
→ 调用PacketTunnelProvider.startTunnel()
3. PacketTunnelProvider启动流程:
→ LibboxSetup() → 创建服务 → 配置TUN接口 → 启动代理
xxx