bd984feff9
根因:iOS 端 vpn_bridge_provider 把 iOS 归入'其他平台 → VpnBridgeMock', 整个 App 用假桥,伪造已连接状态与写死的 URLTest 延迟(18/32/54ms),从不调用 B1/C1 打通的原生 NEPacketTunnelProvider。表现为 UI 显示已连接但流量全直连 (apple 通/google 被墙、RTT 20ms),设备日志无任何隧道/sing-box/节点痕迹。 三处修复: 1. vpn_bridge_provider.dart: iOS → VpnNativeBridge(真原生 MethodChannel)。 2. VpnManager.start(): 先 saveToPreferences+重载(首启触发系统授权、持久化配置) 再 startVPNTunnel,否则对未持久化 manager 调用抛 NEVPNError。对齐 macOS。 3. PacketTunnelProvider.openTun: DNS 补 matchDomains=[""],强制所有 DNS 走隧道, iOS 不设会把隧道 DNS 当补充解析器、查询仍走系统直连 DNS 致污染打不开站点。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
38 lines
1.4 KiB
Dart
38 lines
1.4 KiB
Dart
// vpn_bridge_provider.dart — VpnBridge 平台分派
|
||
//
|
||
// macOS / Linux / Windows → DesktopVpnBridge(真实子进程)
|
||
// 其他平台(iOS / Web / 测试)→ VpnBridgeMock
|
||
import 'package:flutter/foundation.dart';
|
||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||
|
||
import 'desktop_vpn_bridge.dart';
|
||
import 'vpn_bridge.dart';
|
||
import 'vpn_bridge_mock.dart';
|
||
|
||
// 通过 dart:io Platform 按平台选择实现。
|
||
// Web 平台须先检查 kIsWeb(dart:io 在 Web 上不可用)。
|
||
import 'dart:io' show Platform;
|
||
|
||
/// P1 方案B 开关:macOS 是否走原生 System Extension(VpnNativeBridge)而非 PoC 的
|
||
/// sudo 子进程(DesktopVpnBridge)。默认 false——待 PacketTunnel target/签名就绪、
|
||
/// 原生侧联调通过后置 true。见 docs/p1-macos-system-extension.md。
|
||
const bool kUseNativeVpnMacOS = true;
|
||
|
||
/// 全局单例 VpnBridge。Ref 生命周期内不变。
|
||
final vpnBridgeProvider = Provider<VpnBridge>((ref) {
|
||
if (!kIsWeb) {
|
||
if (Platform.isMacOS && kUseNativeVpnMacOS) {
|
||
return VpnNativeBridge();
|
||
}
|
||
// iOS:NEPacketTunnelProvider 内嵌 libbox(B1/C1 已打通)。走原生 MethodChannel
|
||
// (pangolin/vpn → AppDelegate → VpnManager),不再用 mock。
|
||
if (Platform.isIOS) {
|
||
return VpnNativeBridge();
|
||
}
|
||
if (Platform.isMacOS || Platform.isLinux || Platform.isWindows) {
|
||
return DesktopVpnBridge();
|
||
}
|
||
}
|
||
return VpnBridgeMock();
|
||
});
|