clash-better
项目摘要
clash-better 是基于 SwiftUI 的 macOS 原生网络节点巡检与切换工具。应用读取本机 Clash/Mihomo 状态,按策略检测节点延迟与可用性,记录巡检历史,并在满足条件时保持或切换当前节点。当前主线已从早期前后端分离结构收敛为 SwiftPM 原生应用。
作者职责
- 重构原生应用结构、状态模型和异步启动流程。
- 设计巡检策略、节点切换边界、历史与分析页面。
- 完成 MySQL 到 SQLite 的幂等迁移和主链路切换。
- 建立
.app打包、版本元数据、更新检查和发布流水线。
系统架构
SwiftUI 提供原生界面,AppStore 管理可观察状态,InspectionEngine 负责巡检决策,ClashController 处理本机代理控制。GRDB.swift 管理本地 SQLite 历史库。结构不再依赖常驻 Python 后端、Next.js 前端或远程 MySQL,降低桌面工具的运行依赖和故障面。
关键设计决策
- 将 SQLite 设为默认历史库,远程数据库不再是巡检与切换的运行前提。
- “保持当前节点”同样写回当前节点和延迟快照,避免正常分支缺少可见状态。
- 更新检查优先读取版本清单,失败后再回退到 Release API。
- 应用打包使用仓库相对路径并执行 ad-hoc 签名,避免依赖开发机绝对目录。
数据迁移
迁移工具按固定表顺序批量读取旧数据,保留原主键,使用可重复执行的写入策略,并推进 SQLite 自增序列。迁移结束输出逐表行数、主键范围、关键聚合和抽样结果。公开案例不记录实际节点、测量值和本机数据库路径。
工程难点
SwiftUI 可观察状态不能在视图更新过程中无序发布。启动流程被收敛为单次异步 bootstrap,在首帧后加载配置并启动轮询,减少重复任务和状态发布警告。
发布与验证
swift build与 Release 构建验证 SwiftPM 依赖和主程序。- 打包脚本组装可直接运行的
.app,并写入图标、版本和签名信息。 - 发布流水线生成压缩包与 SHA-256 校验文件,主线构建和正式版本使用不同路径。
已知限制
- 应用只适用于 macOS,并依赖本机已经运行且接口兼容的 Clash/Mihomo 服务。
- 发布包为个人工具的开发产物,不代表经过 Apple 公证或 App Store 审核。
- 节点切换策略不能替代用户对网络合规性和订阅来源的判断。
后续演进
后续可补充可重复的策略模拟测试、签名公证和公开演示视频,但不会公开真实订阅或网络测量数据。