Apple 平台的纯粹美学与开源闭环:Clash by Hako 的破局与救赎
从 Network Extension 内存生死线到 Apple TV 大屏突围,在命名风波与开源阵痛中完成血缘闭环
第一幕 · 闭环生态与内存紧箍咒:Apple 原生分流的死锁困局
长期以来,Apple 生态的网络代理工具始终处于割裂的两极。
一侧是老牌商业软件筑起的昂贵壁垒,闭源、黑盒且授权不菲;另一侧则是充斥着 Webview 或第三方桥接的跨平台方案,交互迟钝,与 iOS、macOS 严丝合缝的系统质感格格不入。
更残酷的现实,藏在操作系统深处。
在 Apple 的 Network Extension 框架下,主导数据分流的 PacketTunnelProvider 扩展进程,被系统内核套上了一道极为苛刻的紧箍咒——Jetsam 内存配额:iOS 14 及更早版本上,这个数字被死死压在 15MB,直到 iOS 15 起才放宽到 50MB(越狱社区通过修改 com.apple.networkextension.packet-tunnel 的 ActiveHardMemoryLimit 配置即可验证);macOS 因有交换内存而宽松许多,但扩展进程同样受严格的内存预算约束。
一旦海量规则集加载,或者并发流量瞬时冲高,Go 运行时稍有内存膨胀,系统内核便会痛下杀手,毫无征兆地强制闪退。
而在客厅里的 Apple TV 上,情况更为严峻:整个生态几乎是一片荒漠,用户为了让电视看上海外流媒体,往往不得不耗费巨资折腾软路由或旁路由,一人看剧,全家网络跟着动荡。
“如果只有客厅这块屏幕需要不同的网络线路,就不应该要求整个家庭网络一起改变。”
面对死锁,开发者 tokenpls 选择了最险峻的道路:彻底摒弃中间层包装,用纯正的 Swift 与 SwiftUI 从零构建跨端界面,并将底层内核做外科手术式的极致裁剪。[1][9][10][11][16]
第二幕 · 攻占客厅大屏:Apple TV 焦点引擎与全家桶突围
2026 年 7 月 29 日,Clash 1.0.0 首次提交 Apple App Store 审核并在官网 clash.md 正式亮相,TestFlight 测试通道同步开启。
一场针对 Apple 全生态的突击战全面打响,tokenpls 将目光投向了最难啃的骨头——Apple TV。
tvOS 没有触屏,没有鼠标,唯一的交互凭证是手里那枚 Siri Remote 遥控器。为了在大屏上带来丝滑操控,他在客户端中独立重写了焦点引擎(Focus Engine),重构卡片焦点流与边缘回弹。
2026 年 8 月 2 日,Clash for Apple TV 率先敲开 App Store 审核大门,正式上线。
客厅大屏告别了旁路由折腾史:电视独立配置,独立分流,即点即播,家庭网络稳如磐石。
突围势如破竹。
8 月 25 日,macOS 与 Apple TV 双版本正式上架 App Store,Mac 版在次日更是直接登顶美区 Mac App Store 免费榜首位。
8 月 29 日,历经多轮提审拉锯,iOS 版本终于冲破苹果苛刻的审查防线。
2026 年 9 月 1 日,他在官方频道向所有等待的社区成员宣告:
“从手里的 iPhone、桌上的 Mac,到客厅里的 Apple TV——同一套配置,每个平台都是原生体验。Clash,经典回归。这次是 Apple 全家桶。”[8][12][14][16][17][18]
第三幕 · 硬核深水区:驯服 PacketTunnel 与全链路开源
华丽的原生界面背后,是极其冷酷的系统底层攻防。
为了彻底降服那道 50MB 内存红线(iOS 14 及更早版本更是死卡 15MB),tokenpls 在 Hako 内核中引入了定制的低内存连接准入控制(connection_admission_low_memory.go)。
该机制在隧道启动与高并发握手时,对连接池实行分级配额管理,并针对 Darwin 系统重构了底层进程属主查找(process_owner_lookup_darwin),有效防止了无界缓存冲垮扩展进程。
2026 年 9 月 2 日,基于 mihomo v1.19.30 深度调校的 Hako 内核源码与 XCFramework SDK 正式开源,遵循 GPL-3.0 协议。
在工程链路层面,他建立了严格的依赖锁定体系:客户端通过 Dependencies.lock.json,将内核与适配层锁定在特定 commit SHA 上,确保复现构建与内存稳定性。
2026 年 9 月 5 日,他兑现了早先对社区的承诺:
“代理工具位于网络流量的关键路径,信任不应只来自一句承诺,更应该来自公开、可验证的代码。”
从 Hako 内核、Swift 适配层 Hako-Adapter 到全平台客户端 Hako-Client,整套生产代码链路全部向社区开放,达成了从内核到界面的全链路开源闭环。[2][3][7][6][10][19][20]
第四幕 · 代码血缘大考:从合规危机到上游反哺
然而,全链路开源的喜悦尚未完全舒展,一场代码层面的致命危机骤然爆发。
开源早期,Hako 仓库没有从上游直接 Fork,提交历史更是缺少完整的祖先演进链,被开发者直指严重违反 GPL 许可证的代码溯源准则。
面对代码违规的硬性事实,tokenpls 做出了极富戏剧性的抉择。
2026 年 9 月 6 日凌晨,他在官方频道发出了那篇流传甚广的自省公开信:
“关于没从 Mihomo fork,以及提交不够原子化的问题,在这里跪着狡辩一次。README 和官网一直都写着上游是 Mihomo。上游我们认,贡献我们记,GitHub 我们确实还在学。属于是项目先建了,GitHub 的驾照还没考到就上路开车了。”
随后,是一句饱含极客自嘲的定格:
“给开源社区添堵了,对不起。错不起,我对了,都怪 GitHub。”
私下在官方社群里,面对围观者的指责与群嘲,他也曾难掩桀骜与愤懑:
“Github 一群傻逼,mihomo 原作者都没说啥,wwqgtxx 都没开喷。”
在情绪激动的瞬间,他甚至扬言要彻底剥离上游:
“急眼了,我只用 sing-tun 了,其他协议我自己接了。”
但仅仅一分钟后,极客理智便战胜了情绪:
“不过不至于。感谢上游成百上千的贡献者。”
仅仅数小时后,他用最纯粹的 Git 工程语言给出了代码补救方案。
2026 年 9 月 6 日下午,Hako 仓库推送了关键提交 e6ac1ee 与 9a98ff7——以一次精巧的非线性 Merge Commit,将上游截至 v1.19.30 基线的 4,263 个历史提交连同原作者署名完整合入祖先链,并同步发布了包含 MetaCubeX、Clash 与 sing-box 完整致谢的 NOTICE 文件。
代码血缘修补完成的同时,tokenpls 试图进一步叩开上游官方认可的大门。
9 月 6 日下午,他向 MetaCubeX 官方文档仓库发起了 PR #209 申请在首位收录,当晚被核心维护者 wwqgtxx 无言直接关闭拒绝;次日发起妥协修订 PR #210 退至末尾,仍未获合并。
文档入口的碰壁,让 tokenpls 转向了更为硬核的代码本身。
在排查 OpenVPN 互通时,他敏锐定位到 mihomo 内核在 tls-auth 中硬编码 SHA-1 导致握手超时的陈年暗疾(Issue #2992),于 9 月 7 日下午向上游提交了 PR #3189。
技术层面的真金白银终于赢得了上游的敬意。
2026 年 9 月 8 日凌晨,此前直接关闭文档 PR 的 wwqgtxx 仔细审查后亲自合入了该修复。
tokenpls 在群中难掩激动地感慨:
“感恩了,未来 mihomo 内核里也有我的一滴代码了。”[4][5][6][23][24][25][26][27][21][22]
第五幕 · 命名风波与正统之争:Clash 招牌下的博弈与重构
代码合规闭环了,但产品身上最刺眼的品牌伦理争议,却在此时全面爆发。
原版 Clash 核心由 Dreamacro 主导,早在 2023 年底便已删库归档;而这款全新的客户端,却在官方网站(clash.md)的大幅横幅、应用商店的标题栏上,堂而皇之地直接自称“Clash”。
官网通篇充斥着“Clash 经典回归”的高调宣传,聚光灯全打在这个超级招牌上,底层“Hako”内核鲜少被正面提及。
借壳、揩油、冒名顶替的声浪席卷社区,本站亦不得不单方面定名“Clash by Hako”以防混淆。
面对命名指摘,tokenpls 寸步不让。
2026 年 9 月 12 日,面对社区用户“不能直接叫 clash、clash pro、clashx 这种误导人名字”的质问,官方账号反问回应:“产品重要还是名字重要?你觉得我错了,你用你的正确的交付来证明我错了。”(需要指出,ClashX 等名称此前已有在先项目使用,该独占主张未见公开权属依据)。
这种“经典回归”宣传与原版猫咪图标的沿袭,终于惊动了早已退隐的生态奠基者。
由于大量用户误以为这是原班人马正统续作并不断私信求证,2026 年 9 月 13 日,不堪其扰的 Clash for Windows(CFW)作者 Fndroid 公开划清界限并一针见血地定性:
“别给我发这个经典回归的 App 了拜托,不认识也不太想认识。🙏 除了图标和名称我没见到哪里有经典。😅”
tokenpls 随后在 Twitter/X 晒出被拉黑截图与致谢设置页调侃“江湖又见”,并借 AI 对话论辩经典:“如果今天已有明显更好的替代品,原作是否仍值得打开看一眼?值得,就是经典;不值得,那只是曾经流行。爱过。”
这场交锋并未冷却,反而在技术社区激起了对“正统血脉”更剧烈的争吵。
2026 年 9 月 14 日,面对网络技术博主针对 Fndroid 表态及“无须争正统”的公开评述,tokenpls 借转推强势亮出自己的命名哲学:
“居然还在扯皮,借勇哥帖子说一下我在电报群里刚发的:Clash这个名字不属于Clash for Windows的作者。Clash也不属于我。Clash属于广大用户,用户爱用的Clash才是Clash,开源且免费。Clash如果有名字专利在某人名下才是最大的问题,所以还在扯名字问题的都是住在城里吃饱撑的。”
将公共品牌的权属直接托付给“广大用户”与“开源免费”,是他为自己占据超级 IP 构筑的最高道德掩体。
而在他自己的官方社群里,面对围绕命名与先驱评价的非议与围观,他以“Token”之名(顶着“客服 1号很不高兴为你服务”的诙谐头衔)表现得更为不羁与决绝。在群友讨论外部争议时,他先是淡然回应“好事呀”,随即留下了掷地有声的定调:
“谁能主张谁来,其他瞎逼逼的一律骂回去。”
“不惯这帮老登的嘴脸。”
“做好我们的 Clash 比啥都强。”
紧接着,面对圈内诸多手握商业付费客户端者的冷嘲热讽与资格审查,他在社交平台上彻底撕开温和面具,火力全开:
“这群傻逼有个特性:自己用上了Surge、小火箭、Quan X乃至Stash和Loon,搭上了专线和VPS,然后脸扭过来开喷:你个臭外地的凭啥叫Clash,你知道什么是经典吗?”
他用极具排比力量的宣言颠覆了“经典”的传统定义:
“用户用得起的Clash才是Clash。用户用着顺手的Clash才是Clash,用户还能用的Clash才是Clash,用户用着放心的Clash才是Clash。这才是经典。”
在情绪宣泄的尾声,他更抛出了一记极具挑衅意味的远景预告:
“惹急了我做Windows版本,大饼我先画着,目前Apple全平台的版本还没稳定下来。”
面对外界扣上的“冒牌货”帽子与“谁给你的勇气冒用品牌”的严厉质问,他更彻底开启全方位嘲讽,以辛辣的草莽语言直接解构社区裁判的权威:
“我自己给的自己的勇气,需要在你这走个流程吗?你这一套一套的标准的规章制度在哪里公示?我去哪里申请?你说的官方是谁?是你吗?好大的官威啊,你要当个小区保安业主们都不敢出门,是不是都得找你批个条子?”
面对围观博主“把有些人气死”的调侃,他毫不避讳地戏谑道:
“我出门就是专业气老登的。”
戏剧性的是,他当天曾一度高调发文宣告“本人戒X 三天,专心写代码和发版本。如果不小心上来喷傻逼,当我戒X 失败”,然而面对汹涌的舆论审判,他终究无法按捺战意而“破戒”舌战群雄;而在面对普通用户关于打磨产品、减少宣发争吵的温和劝告时,他又瞬间放下全身戒备,谦逊应道“好的哥,我收敛点儿”。这种对外狂傲决绝、对内能屈能伸的二元反差,将这场围绕正统之争的舆论博弈推向了极具戏剧张力的高潮。[8][12][31][28][29][30][32][33][34][35][36][37]
第六幕 · 时代余响:在风暴中挺立的 Apple 原生基石
tokenpls 与他的 Clash 客户端,在当代代理工具发展史上留下了浓墨重彩却又极具争议的注脚。
他不是一个毫无瑕疵的开源纯粹主义者,也不是一个纯粹的冒名投机客。
他深谙流量规律,顶着社区对“冒名 Clash”的激烈非议自始至终不改应用名,享受着超级品牌的曝光红利;哪怕面对 CFW 奠基者 Fndroid“除了图标和名称我没见到哪里有经典”的公开定性,他依然在官方群内强硬表态“谁能主张谁来,做好我们的 Clash 比啥都强”,借博主讨论宣称“Clash 属于广大用户”,并以“用得起、顺手、还能用、放心”重新解构“经典”,未在品牌策略上有丝毫退让;但面对代码溯源的硬伤,他又以 4,263 个历史提交的完美合并与全链路开源,兑现了技术底线的救赎。
在工程实践上,他实打实地攻克了 tvOS 客厅大屏独立分流、Swift 原生体验与 Network Extension 内存准入控制这些硬核难题。
他为 Apple 生态注入了一款真正能打的原生工具,也让“Clash”这个名字在闭环生态中借壳延续。
但关于品牌挪用、冒名嫌疑与开源伦理的争鸣,也注定将永远刻在这个项目的起点,成为后人审视这段历史时无法绕过的灰色记忆。[1][4][18][20][28][32][33][34]