è§£å³ãæå ³äº Clash Verge çªå£ïŒäœæµè§åšè¿å¡èœ¬å â åªæéå¯çµèæå¥œãçåå ³åµæ»æäžå¹Žèå
Solve Clash Verge's half-closed zombie state on macOS. GUI closes but the root verge-mihomo kernel, PF divert hooks and System Proxy are still alive â browser traffic silently hijacked to a dead socket and every page hangs.
English · äžæ · å¿«éåŒå§ · åèœäº®ç¹ · æ¶æåç · Roadmap
|
ç¹è¿éäžèœœ .zip ç»å€§å€æ°ç°ä»£ Mac (2020 幎åèŽä¹°) |
â³ å³å°æ¯æ (v0.2.0) 欢è¿å Issue +1 å¬ä¿äœ éèŠççæ¬ |
SwiftPM äžè¡åœä»€swift build -c release å³äº§ 310KB äºè¿å¶
|
å äžºè¿æ¯äžªäººåŒæºé¡¹ç®ïŒæ²¡ä¹°æ¯å¹Ž 99 çŸå ç Apple Developer å ¬è¯è¯ä¹ŠïŒïŒç¬¬äžæ¬¡åå»äŒæç€ºãæ æ³æåŒïŒå äžºæ æ³éªè¯åŒåè ããè§£å³åæ³ïŒåªéèŠåäžæ¬¡ïŒä»¥ååå»å°±èœçŽæ¥æåŒïŒïŒ
- å³é® â éäž
ClashVergeæ¥æå .appâ ç¹ ãæåŒãïŒäžæ¯åå»ïŒïŒ- 匹åºçå¯¹è¯æ¡éåç¹ ãæåŒãïŒäœ äŒçå°å¯¹è¯æ¡æ¯å廿¶å€äºäžäžªãæåŒãæé®ïŒ
- åç»æ£åžžåå»å³å¯ãåŠæè¿è¢«æŠ â æåŒ ç³»ç»è®Ÿçœ® â éç§äžå®å šæ§ïŒåŸäžæ»äœ äŒçå°ã已黿¢ ClashVergeæ¥æå ãïŒç¹ ãä»èŠæåŒã å°± OK ã
â 诎æïŒ æä»¬çš
codesign --sign -åäº ad-hoc å¿åçŸåïŒæä»¥äžé¢ 3 æ¥å°±å€ïŒäžéèŠxattr -cræž å±æ§ã
äžæè¯Žæ â æ¯äžæ¯äœ æ¬äººïŒâ
åºæ¯ 1ïŒ äœ çš Clash Verge çå® YouTube / å·å®æé³ïŒç¹çªå£å·Šäžè§é£äžªçº¢è² â æçªå£å ³äºïŒä»¥äžº"代ç圻åºå ³äº"ã
å®é æ åµïŒ GUI çªå£æ¯æ²¡äºïŒäœ root æéç
verge-mihomoå æ žè¿çšè¿åšè·ãPF é²ç«å¢ divert é©åæ²¡æž ãç³»ç»ä»£çåŒå ³è¿åŒç â è¿äžæ¡æµé嫿é©åè³å°äžæ¡è¿æŽ»çãç»æïŒ è±å / Chrome / Safari æææµè§åšæ¯äžæ¬¡ HTTP 请æ±è¿åšåŸå·²ç»æ»æç代ç socket éé â å¡ 30 ç§è¶ æ¶ â äœ ä»¥äžº"ä»å€©çœç»æä¹äº" â éå¯çµèæå¥œãè¿å°±å«åå ³åµæ»æ ð¡ã
åºæ¯ 2ïŒ å ³äº Clash Verge ä¹åæåŒç¥ä¹ïŒæ°žè¿çœå±èœ¬åã
curl zhihu.comç»ç«¯é 0.1 ç§å°±è¿åïŒååæµè§åšæäžåŒ â è¿å°±æ¯æå žåçåå ³æçç¶ã
æ¬é¡¹ç®å°±æ¯è§£å³è¿äžªé®é¢çå€æçº§æ¥æå
ã äžçšäœ è®°äžå sudo kill -9 verge-mihomoãpfctl -dãnetworksetup -setwebproxystate offãç¹äžäžãäžé®åœ»åºå
³éãå°±è¡ïŒåŒ¹äžª Touch ID æçº¹æ¡æå®ã
English â The pain point in 10 seconds
You close the Clash Verge window on macOS. You think the proxy is OFF.
Reality: the root-owned
verge-mihomokernel is still alive, the PF divert rule is still loaded, the System Proxy switch is still ON â all silently hijacking every browser request.Result:
curl google.comin the terminal returns in 0.1 seconds (direct DNS + direct route), but every browser hangs for 30s then times out. The only cure you know is reboot your Mac.This app fixes it in one click + one Touch ID prompt.
| åŸæ | åèœ | 诎æ | Feature in English |
|---|---|---|---|
| ð¢ð¡ð§âª | åå±çº¢ç»¿ç¯ç¶æ | æ¯ 10 ç§å·¡æ£ GUIè¿çš / Mihomoå æ ž / ç³»ç»ä»£ç+PFé©å / ä¿å§æå¡(clash-verge-service)ïŒåç§å€å®äžç®äºç¶ | 4-layer health check, 4-state traffic-light indicator (incl. ð§ zombie-nanny) |
| ðïž | äžé®åœ»åºå ³é | å åä¿å§æå¡(é²å æ žå€æŽ») â å ³GUI â å ³æææ¥å£ç³»ç»ä»£ç â é眮PF â ærootå æ ž â å·DNSïŒååæ§è¡ | One-click atomic cleanup (nanny service FIRST, then GUI + Proxy + PF + kernel + DNS) |
| ð | äžé®å¯åš | èªåšå®äœ /Applications/Clash Verge.appïŒå·²è¿è¡åååå°ïŒè¢«åçšçä¿å§æå¡äŒèªåšæ¢å€ |
One-click launch / foreground-activate; auto-restores the nanny service if disabled |
| ð | åŒåžžæç³»ç»éç¥ | åå ³ð¡ / åµå°žä¿å§ð§ éœäŒåŒ¹åçéç¥ïŒ15 åéå»éé²éªæ° | Native notifications for both half-closed & zombie-nanny states, 15-min dedup |
| 𧪠| --self-test èªæ£æš¡åŒ |
äžè¿UIãç»ç«¯éçŽæ¥æå°åå±ç¶æ JSON 飿 Œææ¬ïŒéåèæ¬ / launchd çæ§ | Headless CLI self-test mode for scripts & LaunchD watchdogs |
| ð | Touch ID åçæé | 管çåæäœèµ° AppleScript do shell script with administrator privilegesïŒäžçšæåš sudo |
Native macOS permission dialog â supports Touch ID & Watch unlock |
| ðŠ | é¶ç¬¬äžæ¹äŸèµ | åªçšç³»ç»æ¡æ¶ SwiftUI / AppKit / Foundation / UserNotificationsïŒçŒè¯äº§ç© 310KB | No Carthage / CocoaPods / SPM packages. Pure system frameworks. 310 KB release binary. |
- å» Releases â äžèœœææ°ç
ClashVergeæ¥æå -vX.Y.Z.dmgæ.zip - è§£å â æè¿ åºçšçšåº (Applications) æä»¶å€¹
- åå»æåŒ â ç¬¬äžæ¬¡è¿è¡å³é® â æåŒïŒç»è¿å ¬è¯èŠåïŒ
- é¡¶éšèåæ ç«å»åºç° ðŠððŠ åŸæ ïŒæ ¹æ®äœ çåå±ç¶ææŸç€º ð¢ / ð¡ / ð§ / ⪠åç§é¢è²
- å¹³æ¶äžçšç®¡å®ïŒå®åšåå°æææ¯ 10 ç§å·¡æ£äžæ¬¡ãåªå€©æµè§åšçªç¶å¡äºïŒå ç宿¯äžæ¯äº®äºé»ç¯ ð¡ïŒç¹äžäžãäžé®åœ»åºå ³éãå°±å®äºå¿ã
éèŠ macOS 14+ / Swift 6.0 / Xcode Command Line ToolsïŒ
git clone https://github.com/CHANGGELY/ClashVerge-FirstAidKit.git
cd ClashVerge-FirstAidKit
# â Debug çŒè¯ (fast compile)
swift build
./.build/debug/ClashVergeæ¥æå
--self-test # ç»ç«¯è·èªæ£ (äžè¿UI)
./.build/debug/ClashVergeæ¥æå
# æ£åžžèåæ æš¡åŒ
# â¡ Release çŒè¯ (310 KB 粟ç®ç)
swift build -c release
./.build/release/ClashVergeæ¥æå
æ --self-test æ¥è¿äœ çèªåšåèæ¬ãlaunchd çéšçãæè
Monitority çæ¬å°çæ§å·¥å
·ïŒ
# éåºç è¯ä¹: 0 = èªæ£å®æ(ç»è®ºçæå°), 2 = èªæ£è¶
æ¶(shellå¡äœ)
./ClashVergeæ¥æå
--self-test ; echo "exit=$?"| ð¡ åå ³åµæ»æïŒé»ç¯èŠåïŒ | ð§ åµå°žä¿å§æïŒv0.1.2 æ°å¢ïŒ | ð¢ æ£åžžå·¥äœæïŒç»¿ç¯ïŒ | ⪠圻åºå ³éæïŒç°ç¯ïŒ |
|---|---|---|---|
| èåæ åŸæ é»è² + æŸç€º"GUIå·²å ³ïŒå æ žè¿çšè¿åšè·" | èåæ åŸæ åµå°žç»¿ + æŸç€º"å æ žå·²æ»äœä¿å§è¿æŽ»çïŒéæ¶äŒå€æŽ»å æ ž" | èåæ åŸæ ç»¿è² + æŸç€º"代çåŒæè¿è¡äžïŒç³»ç»ä»£çå·²åŒ" | èåæ åŸæ ç°è² + æŸç€º"åå±å šéšæž çå¹²åïŒçŽè¿" |
ð å±åŒçäžæèå宿Ž5è¡ç¶æ + 4䞪æäœæé® + èªåšå·¡æ£åŒå ³
âââââââââââââââââââââââââââââââââââââââââââââââ
â ð¡ æ£æµå°åå
³åµæ»æïŒGUIçªå£å·²å
³ïŒå
æ žè¿çšè¿åšè·ïŒæµè§åšäŒè¢«å¡ â
âââââââââââââââââââââââââââââââââââââââââââââââ€
â â GUIçªå£è¿çš å·²å
³é â
â â
Mihomoå
æ žè¿çš è¿è¡äž â é®é¢åšè¿å¿ â
â â ç³»ç»ä»£çåŒå
³ å·²å
³é â
â â PFæµé嫿é©å å·²æž
ïŒæ£åžžïŒ â
â â
ä¿å§æå¡(çå®å
æ ž) è¿è¡äž â v0.1.2æ°å¢ â
âââââââââââââââââââââââââââââââââââââââââââââââ€
â ðŽ ðïž äžé®åœ»åºå
³é Clash VergeïŒåŒ¹å¯ç æ¡ïŒ â
â åä¿å§ + å
³GUI + å
³ä»£ç + é眮PF + æå
æ ž + å·DNSâ
â ð äžé®æ£åžžå¯åš Clash Verge â
â ä» /Applications å¯åšïŒå·²è¿è¡åæ¿æŽ»çªå£ â
â ð æåšå·æ°åå±ç¶æïŒç«å³æ£æ¥äžæ¬¡ïŒ â
â ð¡ïž èªåšå·¡æ£ïŒæ¯10ç§æ£æ¥äžæ¬¡ïŒ [åŒå
³] ON â
âââââââââââââââââââââââââââââââââââââââââââââââ€
â Clash Verge æ¥æå
v0.1.2 · å屿£æµ éåºæ¥æå
â
âââââââââââââââââââââââââââââââââââââââââââââââ
Clash Verge ç讟计就æ¯å屿¶æå åšäžèµ·ïŒåå±ç¶æåèªç¬ç«ã没æåå忥æºå¶ ââ è¿å°±æ¯åå ³æçæ ¹å ïŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Layer 1 · GUI çªå£è¿çš ("Clash Verge") â äœ ç¹çº¢åâåªå
³äºè¿äžå± â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â Layer 2 · Mihomo å
æ žè¿çš (verge-mihomo) â rootæéè·, äœ æ®éæé碰äžå°â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â Layer 3 · macOS ç³»ç»é©å (䞀æ¡ç¬ç«éŸè·¯) â
â 3a) scutil --proxy ç³»ç»ä»£çåŒå
³ (HTTPEnable / HTTPSEnable) â
â 3b) pfctl -s rules PF divert æµéæ¹éé©å (嫿å
šéšå
) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â Layer 4 · ä¿å§æå¡ (clash-verge-service) â KeepAliveåžžé©»LaunchDaemonâ
â å
æ žäžæ»å®å°±æå
æ žéæ°æèµ· â åªæå
æ ž = çœæ ð§ (v0.1.2 çå®èž©å)â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â²
âââ åå±äžåæ¥ = åå
³åµæ»æ ð¡ / åµå°žä¿å§æ ð§ = å
³äºçªå£ â çéåº
ð§ v0.1.2 çå®èž©åïŒ2026-08-15ïŒïŒçšæ·ç¹å®ãäžé®åœ»åºå ³éãïŒå æ žå ç§å 被
clash-verge-serviceïŒKeepAlive åžžé©»çç³»ç»æ§ LaunchDaemonïŒèªåšæèµ· ââ åªæå æ žäžåä¿å§ = çœæãæä»¥ç°åšäžé®å ³éçæ§è¡é¡ºåºéåŸæ¯ïŒå åä¿å§ïŒlaunchctl bootoutïŒïŒåæå æ žïŒäžé®å¯åšæ¶åæä¿å§bootstrapæ¢å€åæ¥ïŒTUN æš¡åŒç §åžžå¯çšã
æ¬æ¥æå åçäº = 让åå±ç¶ææ°žè¿ä¿æäžèŽïŒèŠä¹å šéšæŽ»çïŒð¢æ£åžžïŒïŒèŠä¹äžå£æ°ååæ§å°å šéšæž å¹²åïŒâªå šå ³ïŒå«åä¿å§ïŒãç»äžçäžéŽæã
å€å®è§åïŒ
- ð¢ æ£åžžå·¥äœæïŒå æ žè¿æŽ»çïŒä»£çåšè·ïŒïŒæè GUI åŒç + é©åæ£åžž
- ð¡ åå ³åµæ»æïŒéç¹ïŒïŒïŒGUIæ»äºïŒäœå æ ž/ç³»ç»ä»£ç/PFé©åè³å°äžæ¡è¿æŽ»ç
- ð§ åµå°žä¿å§æïŒv0.1.2 æ°å¢ïŒïŒå æ žæ»äºãé©åå šæž ïŒäœä¿å§æå¡è¿æŽ»ç ââ å®éæ¶äŒå€æŽ»å æ žïŒã圻åºå ³éãåäžå¯å®
- ⪠圻åºå ³éæïŒGUIæ» + å æ žæ» + ç³»ç»ä»£çå ³ + PFé©åæž + ä¿å§æå¡å
| äŒå 级 | åèœ | ç®æ çšæ· | Status |
|---|---|---|---|
| P0 | launchd åŽ©æºæ¢å€å®æ€è¿çšïŒæ¥æå
èªå·±åŽ©äºïŒlaunchd ä¹èœçæ§å°äžå±äžäžèŽèªåšæž
ïŒ |
ç¡¬æ žçšæ· | Planned |
| P1 | èªå®ä¹ååçœåå / èªå𿣿µ "curl zhihu.com æµè§åšå¡äœç»ç«¯é" çå蜚åŒåžž | é«çº§çšæ· | Planned |
| P2 | DMG èªåšæå»º Release + Apple Developer ID çŸå + å ¬è¯ïŒNotarizationïŒ | æ®éçšæ· | Planned |
| P3 | clash-verge-rev / verge-mihomo config äžé®å¯Œå ¥ + fake-ip-filter è¯æ³éè¯¯æ£æµ | å šäœçšæ· | Planned |
| P4 | Homebrew Cask äžé®å®è£
ïŒbrew install --cask clash-verge-firstaidkit |
Mac èçšæ· | Planned |
| P5 | i18n è±æ / æ¥æçé¢ + Windows ç§»æ€æè·¯ææ¡£ïŒLinux äžåïŒClash æ¬èº«çïŒ | æµ·å€çšæ· | Planned |
- Star History â åŠææ¬é¡¹ç®åž®äœ çè¿äžæ¬¡éå¯ïŒè¯·é¡ºæç¹äžª âïŒè®©æŽå€äººçå°
- ææ¯ç€Ÿåºååžæš¡æ¿ïŒæ¬¢è¿èœ¬å / äºåïŒïŒ
ãè§£å³äºïŒãClash Verge å ³çªå£åæµè§åšå¡èœ¬åçäžå¹Žèåç»äºäžçšéå¯äºïŒèªå·±åäºäžªèåæ æ¥æå 倿ïŒçŽ«ççž+æ¥æç®±+红绿ç¯åŸæ å¯ç±å°ç https://github.com/CHANGGELY/ClashVerge-FirstAidKit
- QQ / Telegram / V2EX / ä»ä¹åŒåŸä¹° / å°äŒèœ¯ä»¶ / ç¥ä¹ïŒä»»äœäžäžªäžæææ¯ç€ŸåºåäžèŽŽïŒéäžäœ èªå·±çäœ¿çšæªåŸïŒèœè®©è¿äžªå·¥å ·æŽå¿«å°èŸŸè¢«åäºåŸä¹ ççšæ· ð
æ¬é¡¹ç®ç GitHub Actions Release æµæ°Žçº¿å·²ç»å šèªåšåž®äœ 宿ãçŒè¯ â ç»è£ .app â ad-hocçŸå â ZIPæå â SHA256 â å建Release â äžäŒ éä»¶ãå šéšæ¥éª€ãäœäžºç»Žæ€è ïŒäœ åªéèŠæäžäžª Git Tag + push å°±è¡ïŒ
cd ClashVergeæ¥æå
# â (å¯é) å
æ¬å°ç¡®ä¿ Release çŒè¯éè¿
swift build -c release && ./.build/release/ClashVergeæ¥æå
--self-test
# â¡ æè¯ä¹åçæ¬ tag (vX.Y.ZïŒå¿
é¡» v åŒå€ŽïŒ)
git tag -a v0.1.0 -m "release(åŒæº): v0.1.0 MVP · äžå±çº¢ç»¿ç¯ + äžé®æž
ç"
# ⢠push tag å° GitHub â ç«å»è§Šå .github/workflows/release.yml
git push origin v0.1.0ç¶åå» Actions â ç 3~5 åéïŒèªåšè·å®ååš Releases â å°±äŒåºç°äžäžªææ°çïŒé䞀䞪éä»¶ïŒ
| éä»¶ | çšé |
|---|---|
ClashVerge-FirstAidKit-v0.1.0-macOS-arm64.zip |
çšæ·çŽæ¥äžèœœè§£åå³çšïŒApple Silicon M1~M4ïŒå³é®æåŒå³å¯ïŒ |
ClashVerge-FirstAidKit-v0.1.0-macOS-arm64.zip.sha256 |
å®å šçšæ·äžèœœ ZIP åçšæ¥æ ¡éª SHA256 ååžïŒç¡®è®€æä»¶æ²¡è¢«ç¯¡æ¹ |
ð¡ æåšè§ŠåïŒäžæ³æ tagïŒïŒä»åº Settings â Actions â 巊蟹éãReleaseãâ å³èŸ¹ Run workflow æé®ïŒæåšå¡«çæ¬å·å°±è¡ïŒéåç¬¬äžæ¬¡è°è¯æµæ°Žçº¿ã
äžæåœåãäžææ³šéãäžæ commit message éœå¯ä»¥ â 对é«äžç / 倧åŠçåŒæºæ°äººæåºŠå奜ã诊ç»ç CONTRIBUTING.mdïŒåªéèŠè®°äœäžæ¡ïŒ
- æä»¶åŒå€Žå¿ é¡»æäžææä»¶å€ŽïŒè§£éè¿äžªæä»¶å¹²åç + 䞺ä»ä¹è¿ä¹åïŒ
- åé / åœæ° / ç±»åäŒå äžæïŒäžäŒæŒè±ææ²¡å ³ç³»ïŒæŒé³ä¹è¡ïŒäžææçŽæ¥ïŒ
- æ PR 忬å°è·äžé
swift build -c release && ./.build/release/ClashVergeæ¥æå --self-testéåºç 0
GPL-3.0-only â äžäžæžž Clash Verge rev ä¿æäžèŽã诊ç»ç LICENSEã
- clash-verge-rev/clash-verge-rev â åç Clash Verge å»¶ç»é¡¹ç®ïŒGPL-3.0ïŒ
- MetaCubeX/mihomo â æä»¬å®æ€çå æ žïŒClash.Meta å»¶ç»ïŒ
- ææèž©è¿ãå ³äºè¿æ¯å¡ãåçäžæ Clash çšæ·ïŒäœ 们çåæ§œå°±æ¯è¿äžªé¡¹ç®è¯ççæºåšå ðª
Made with ð + SwiftUI in China.