讓 Arc 瀏覽器在停止服務後繼續運作:macOS 版本凍結與遠端開關封鎖實作指南
讓 Arc 瀏覽器在停止服務後繼續運作:macOS 版本凍結與遠端開關封鎖實作指南 Arc 將在 2026-12-22 停止運作。這份指南寫給想在 macOS 上繼續自用 Arc 的使用者和開發者,從確認版本、輕量備份、鎖住遠端 flag,到封鎖更新伺服器(含 IPv6),整理成可以直接執行的完整流程與 script。
讓 Arc 瀏覽器在停止服務後繼續運作:macOS 版本凍結與遠端開關封鎖實作指南
適用技術棧 :macOS 26、Arc 1.170.0(build 89123)、Sparkle 2、LaunchDarkly、bash、defaults、/etc/hosts、AppleScript(osascript)
前陣子 The Browser Company 宣布 Arc 會在 2026-12-22 完全停止運作。不是停止更新,而是直接從遠端關掉,帳號也會一起停用。Arc 的側邊欄和 Spaces 我用了兩年多,真的捨不得,所以花了一個下午把它拆開來看,搞清楚它會從哪裡被關掉,再用「只改設定、不動 binary」的方式把那幾條路堵住。過程中也踩到兩個原版社群指南沒寫的坑(IPv6 和 macOS 隱私保護),這篇把完整流程和可以直接跑的 script 都整理好了,照著做大概半小時就能完成。
1. 這個系統做什麼
概覽
把一份已經安裝好的 Arc 凍結在一個「宣布關閉前」的版本,並讓它不再接收三種來自伺服器的控制:自動更新、遠端 feature flag(尤其是強制登出開關),以及更新檔的下載來源。全程只修改使用者層級的設定和系統 hosts 檔,Arc.app 本身的簽章維持原樣。
解決什麼問題
Arc 有三條路會被遠端關掉:
遠端強制登出 :Arc 透過 LaunchDarkly 讀取 arc-force-sign-out-enabled 這個 flag。公司把它打開,所有人就會被登出,而新帳號註冊已經關閉,所以登不回去。
告別版更新 :Sparkle 自動更新預設是開的,一個新版本就能改掉 Arc 的行為。
帳號刪除 :啟動時會跟 Firebase 驗證登入狀態,伺服器端刪除帳號會讓 Arc 清掉本機 session。
這套流程處理第 1、2 點,第 3 點則提供選配做法。
功能邊界(Scope)
包含
檢查目前版本,以及官方 appcast 上的最新版本
透過 Sparkle 正常升級到指定版本(宣布關閉前的最後一版)
輕量備份(約 600 MB,只備份關鍵資料)
用 defaults 關閉自動更新,並覆寫遠端 flag
用 /etc/hosts 同時封鎖 IPv4 和 IPv6
驗證與還原流程
不包含
修改或重新簽署 Arc binary
讓同步、Boosts、Ask Arc 等依賴伺服器的功能繼續運作(伺服器關了就沒了)
Chromium 安全更新(12/22 之後不會再有,這是逆向無法解決的部分)
Windows 版 Arc(路徑和機制不同,需確認)
2. 整體架構與資料流
資料流
[Arc 1.167.1 + 已下載的 1.168.0 更新]
│
├─ Step 0 確認版本:讀 Info.plist + 抓官方 appcast
│
├─ Step 1 透過 Sparkle 升級 ──► Arc 1.170.0(10/21 發布,宣布關閉前的最後一版)
│
├─ Step 2 靜態驗證:strings 確認 flag 名稱存在於新版 binary
│
├─ Step 3 輕量備份 ──► ~/ArcBackup-YYYYMMDD/(plist、Storable*.json、各 profile 的關鍵 SQLite)
│
├─ Step 4 defaults write(Arc 關閉狀態)
│ ├─ SUEnableAutomaticChecks = false
│ ├─ SUAutomaticallyUpdate = false
│ ├─ shouldAutomaticallyUpdateArc = false
│ └─ transientFeatureFlagOverrides = "arc-force-sign-out-enabled=false|auto-updates-enabled=false"
│
├─ Step 5 /etc/hosts(root 權限)
│ └─ 7 個網域 × { 0.0.0.0, :: }
│
└─ Step 6 驗證:DNS 解析、curl 連線、重開 Arc 後 defaults 仍存在
│
▼
[Arc 1.170.0:不更新、遠端 flag 凍結、本機資料完整]
GEEKAZ Design engineering from Taipei. Building courses, tools, and resources for designers who code.
來源檔案參考(僅供對照,非必要)
⚠️ 以下路徑僅標記程式碼出處,閱讀此 PRD 不需要存取這些檔案。
原始檔案路徑 角色 說明 arc-step2-hosts.sh核心邏輯 hosts 封鎖 script,支援套用和 --undo 還原,IPv4 + IPv6 docs/13_ARC/01_arc-reverse-engineering-feasibility.md研究紀錄 Arc.app 結構、保護機制、逆向可行性分析 docs/13_ARC/02_keep-arc-alive-github-survey.md研究紀錄 GitHub repo 調查、社群指南驗證、本機套用紀錄 /Applications/Arc.app/Contents/Info.plist資料來源 版本號、Sparkle feed URL、內建預設值 ~/Library/Preferences/company.thebrowser.Browser.plist修改對象 Arc 的使用者設定 ~/Library/Application Support/Arc/備份對象 Arc 資料(Storable*.json、User Data/) ~/Library/Caches/company.thebrowser.Browser/org.sparkle-project.Sparkle/檢查對象 Sparkle 已下載、等待安裝的更新
外部依賴 依賴 類型 用途 Sparkle 2 Arc 內建更新框架 讀 SU* 設定決定要不要檢查和安裝更新 LaunchDarkly 遠端 feature flag 服務 Arc 的遠端開關來源,離線時會沿用本機快取 releases.arc.net/updates.xmlSparkle appcast 官方版本清單,用來確認最新版 defaults / plutilmacOS CLI 讀寫 plist dscacheutil / mDNSRespondermacOS DNS 清 DNS 快取、驗證 hosts 是否生效 osascriptmacOS CLI 用系統密碼視窗取得 root 權限(繞過 TCC 的坑) strings / codesign / spctlmacOS CLI 靜態驗證 flag 名稱、確認簽章沒被破壞 ciankellyy/keep-arc-alive 社群指南 原始逆向結論(本文已實測驗證並補上缺漏) LuLu / Little Snitch 選配 單獨擋 Arc 連 Firebase
環境變數 / 設定 # 緊急模式:被登出時跳過啟動時的登入檢查(同步關閉、Boosts 不顯示,資料不會被刪)
ARC_E2E_TESTS=1 # 用法:open --env ARC_E2E_TESTS=1 -a Arc
# Arc 的設定 domain(bundle id)
company.thebrowser.Browser
3. 資料結構與型別定義
輸入格式 // 開始前要收集的本機狀態
interface ArcInstallState {
shortVersion: string // Info.plist CFBundleShortVersionString,例如 "1.167.1"
build: number // Info.plist CFBundleVersion,例如 88217
chromiumVersion: string // ArcCore.framework Resources/Info.plist,例如 "154.0.8037.98"
running: boolean // pgrep -x Arc
stagedUpdate?: { // Sparkle 已下載、等著安裝的版本
shortVersion: string // 例如 "1.168.0"
build: number // 例如 88413
}
lastUpdateCheck: string // defaults SULastCheckTime
}
// 官方 appcast(RSS + sparkle namespace)每個 item 的關鍵欄位
interface AppcastItem {
shortVersionString: string // "1.170.0 (89123)"
version: number // 89123
pubDate: string // "Oct 21, 2026 at 8:44:00 PM"
enclosureUrl: string // 完整 zip
deltas: { from: number; url: string }[]
}
輸出格式 // 套用完成後的目標狀態
interface FrozenArcState {
shortVersion: "1.170.0"
build: 89123
defaults: {
SUEnableAutomaticChecks: false
SUAutomaticallyUpdate: false
shouldAutomaticallyUpdateArc: false
transientFeatureFlagOverrides: "arc-force-sign-out-enabled=false|auto-updates-enabled=false"
}
hostsBlock: {
domain: string
ipv4: "0.0.0.0"
ipv6: "::"
}[] // 共 7 筆
backupDir: string // ~/ArcBackup-YYYYMMDD
hostsBackup: "/etc/hosts.before-arc"
}
Feature flag 覆寫格式 transientFeatureFlagOverrides = "<flag>=<value>|<flag>=<value>"
分隔符是 |,值是字串形式的 true / false
Arc 啟動時會讀取,而且不會清掉它
本機的覆寫值優先於 LaunchDarkly 伺服器的值
資料庫 Schema 不適用。Arc 的資料是 JSON(Storable*.json,用 Swift Codable 編碼)加上 Chromium 的 SQLite(Login Data、Cookies、History、Web Data)。這次只複製、不修改,所以不需要了解 schema。
有一個值得知道的細節:StorableSidebar.json 裡的 items、spaces 陣列是 [id, 物件, id, 物件, ...] 交錯排列的。這是 Swift JSONEncoder 遇到「key 不是 String 的 Dictionary」時的預設編碼方式,所以實際項目數是陣列長度的一半。
4. 一步步實作 坦白說,這套流程每一步都不難,難的是順序和那兩個沒寫在任何地方的坑,建議照順序走一遍。
Step 1:確認目前版本與官方最新版本 目的 :知道自己在哪一版、官方最新是哪一版、有沒有已經下載好等著安裝的更新。
#!/bin/bash
APP=/Applications/Arc.app/Contents
echo "== 已安裝"
defaults read "$APP/Info.plist" CFBundleShortVersionString
defaults read "$APP/Info.plist" CFBundleVersion
defaults read "$APP/Info.plist" BCNYBuildDate
plutil -p "$APP/Frameworks/ArcCore.framework/Versions/A/Resources/Info.plist" | grep ShortVersion # Chromium 版本
echo "== Sparkle 狀態"
defaults read company.thebrowser.Browser SULastCheckTime 2>/dev/null
STAGED=~/Library/Caches/company.thebrowser.Browser/org.sparkle-project.Sparkle/Installation
find "$STAGED" -path '*Arc.app/Contents/Info.plist' -exec plutil -p {} \; 2>/dev/null \
| grep -E 'CFBundleShortVersionString|"CFBundleVersion"'
echo "== 官方 appcast(最新在最上面)"
curl -s https://releases.arc.net/updates.xml \
| grep -oE '<(sparkle:shortVersionString|pubdate)>[^<]+' \
| sed -E 's/<[^>]+>//' | paste - - | head -5
Sparkle 下載完更新之後就不會再檢查了 ,會一直等你關掉 Arc 才安裝。實測 SULastCheckTime 停在 10/8,導致落後三個版本(1.167.1,官方已經到 1.170.0)。所以「我的 Arc 版本比別人舊」通常不是有沒有加入 beta 的問題,而是更新卡在這裡。
選版本的原則是:選「宣布關閉之前」發布的最新版 。1.170.0 是 10/21 發布的,比 10/22 的宣布早一天,而且是社群指南的測試版本。
Step 2:透過 Sparkle 升級到目標版本 目的 :用 Arc 內建的更新機制升級,不用另外下載完整安裝包。
選單列 Arc → Check for Updates
安裝並重新啟動。如果之前已經下載好舊的更新,可能要兩輪 :第一輪先裝那個舊的更新,重開後再檢查一次才會抓到最新版
如果更新視窗出現的版本比目標版本新,就不要裝 (那可能是宣布關閉之後才做的版本)
APP=/Applications/Arc.app
defaults read "$APP/Contents/Info.plist" CFBundleShortVersionString # 預期 1.170.0
defaults read "$APP/Contents/Info.plist" CFBundleVersion # 預期 89123
codesign --verify --deep "$APP" && echo "deep verify OK"
spctl --assess -vv "$APP" # 預期 accepted / Notarized Developer ID
codesign --verify --deep --strict 可能出現 resource fork, Finder information, or similar detritus not allowed。這只是檔案上帶有 extended attributes(例如更新時留下的 quarantine 標記),簽章本身沒問題,以 --deep(不加 --strict)和 spctl 的結果為準。
Step 3:靜態驗證 flag 名稱是否存在 目的 :社群指南是在特定版本上測試的,換一個版本之前,先確認要覆寫的 flag 真的存在於你的 binary 裡。
B=/Applications/Arc.app/Contents/MacOS/Arc
for k in arc-force-sign-out-enabled auto-updates-enabled transientFeatureFlagOverrides \
shouldAutomaticallyUpdateArc launchdarkly releases.browserinternal.com; do
printf "%-32s %s\n" "$k" "$(strings -arch arm64 "$B" | grep -c -- "$k")"
done
# 會連到的更新和 flag 網域(用來核對 hosts 清單)
strings -arch arm64 "$B" \
| grep -oE '[a-z0-9.-]*(launchdarkly\.com|releases\.arc\.net|browserinternal\.com)[a-z0-9./-]*' | sort -u
字串 1.167.1 1.170.0 arc-force-sign-out-enabled0 1 auto-updates-enabled1 1 transientFeatureFlagOverrides2 2 shouldAutomaticallyUpdateArc4 4
強制登出的 flag 是在 10/2 到 10/21 之間才加進去的,代表官方確實在宣布前就先埋好了開關。
15 bytes 以內的字串用 strings 找不到 (例如 ARC_E2E_TESTS)。Swift 的 small string 會直接編進指令的 immediate value,不會放在 __cstring section。找不到不代表不存在,這種情況要用反組譯工具或實機測試確認。
Step 4:輕量備份 目的 :在修改任何設定之前,先保住無法重建的資料。Arc 的完整資料約 13 GB,但大部分是網站快取,關鍵資料只有幾百 MB。
#!/bin/bash
# 必須在 Arc 關閉時執行
set -euo pipefail
shopt -s nullglob
pgrep -x Arc >/dev/null && { echo "請先完全關閉 Arc"; exit 1; }
SRC="$HOME/Library/Application Support/Arc"
DEST="$HOME/ArcBackup-$(date +%Y%m%d)"
[ -e "$DEST" ] && { echo "$DEST 已存在,停止"; exit 1; }
mkdir -p "$DEST/AppSupportArc/User Data"
# 1. 設定檔:原始檔 + 透過 cfprefsd 匯出(避免快取中的值沒寫回磁碟)
cp -p "$HOME/Library/Preferences/company.thebrowser.Browser.plist" "$DEST/"
defaults export company.thebrowser.Browser "$DEST/company.thebrowser.Browser.exported.plist"
# 2. Arc 獨有的資料:Spaces、pinned tabs、資料夾、快捷鍵、連結分流規則
cp -p "$SRC"/Storable*.json "$DEST/AppSupportArc/"
# 3. Chromium profile 的關鍵檔案(每個 profile 都要)
cp -p "$SRC/User Data/Local State" "$DEST/AppSupportArc/User Data/"
for p in "$SRC/User Data"/Default "$SRC/User Data"/Profile\ *; do
name=$(basename "$p"); out="$DEST/AppSupportArc/User Data/$name"; mkdir -p "$out"
for f in "Login Data" "Login Data For Account" Cookies History Preferences \
"Secure Preferences" "Web Data" Bookmarks; do
for g in "$p/$f" "$p/$f-journal" "$p/$f-wal"; do
[ -f "$g" ] && cp -p "$g" "$out/"
done
done
[ -d "$p/Local Extension Settings" ] && cp -Rp "$p/Local Extension Settings" "$out/"
done
chmod -R go-rwx "$DEST"
echo "備份完成:$DEST"
# 驗證
du -sh "$DEST"
cmp "$DEST/AppSupportArc/StorableSidebar.json" "$SRC/StorableSidebar.json" && echo "sidebar identical"
plutil -lint "$DEST"/*.plist
一定要在 Arc 關閉時 做。SQLite 和 JSON 在 Arc 執行中會持續寫入,這時候複製可能拿到不一致的狀態。
Login Data 裡的密碼是用 macOS 鑰匙圈的「Arc Safe Storage」金鑰加密的,這份備份只能在同一台 Mac、同一個使用者帳號上還原 。
StorableFirebaseEncryptionKey.json 裡有同步加密金鑰,備份資料夾不要上傳、不要 commit。
被排除的大檔案:File System、Service Worker(各約 3 GB),以及 Extensions(約 1 GB,重新安裝就好)。
Step 5:鎖住更新與遠端 flag 目的 :讓 Sparkle 不再檢查和安裝更新,並把兩個危險的遠端 flag 固定成 false。
#!/bin/bash
# 必須在 Arc 關閉時執行,否則 Arc 結束時可能把記憶體中的設定寫回去
pgrep -x Arc >/dev/null && { echo "請先完全關閉 Arc"; exit 1; }
D=company.thebrowser.Browser
defaults write $D SUEnableAutomaticChecks -bool false
defaults write $D SUAutomaticallyUpdate -bool false
defaults write $D shouldAutomaticallyUpdateArc -bool false
defaults write $D transientFeatureFlagOverrides \
-string "arc-force-sign-out-enabled=false|auto-updates-enabled=false"
# 驗證:值與型別都要對(三個 boolean + 一個 string)
for k in SUEnableAutomaticChecks SUAutomaticallyUpdate shouldAutomaticallyUpdateArc transientFeatureFlagOverrides; do
printf "%-32s %s (%s)\n" "$k" "$(defaults read $D $k)" "$(defaults read-type $D $k)"
done
for k in SUEnableAutomaticChecks SUAutomaticallyUpdate shouldAutomaticallyUpdateArc transientFeatureFlagOverrides; do
defaults delete company.thebrowser.Browser "$k"
done
修改前這 4 個 key 通常都不存在 ,Arc 用的是 Info.plist 裡的內建預設值(SUEnableAutomaticChecks = true、SUAutomaticallyUpdate = true)。所以還原用 delete 就好,不需要寫回 true。
SU* 是 Sparkle 的標準設定 key,使用者層級的值會蓋過 Info.plist 的預設值,這是 Sparkle 官方支援的行為。
Step 6:用 /etc/hosts 封鎖伺服器(IPv4 + IPv6) 目的 :雙重保險。就算設定被改回去,Arc 也連不到更新伺服器和 LaunchDarkly,遠端 flag 會停在最後一次的本機快取值。
這是整個流程最容易踩坑的一步。原版社群指南只寫了 0.0.0.0,但只要網路有 IPv6,查 AAAA 記錄時 hosts 裡沒有對應項目,系統就會照常去問 DNS,拿到真實的 IPv6 位址,等於只擋了一半。實測 curl -v 直接走 [2a06:98c1:...]:443 連上,回應 HTTP 200。
#!/bin/bash
# keep-arc-alive:用 /etc/hosts 擋掉 Arc 的更新伺服器 + LaunchDarkly 遠端 flag
# 同時擋 IPv4(0.0.0.0)和 IPv6(::)
#
# 套用:sudo bash arc-step2-hosts.sh
# 還原:sudo bash arc-step2-hosts.sh --undo
set -euo pipefail
HOSTS=/etc/hosts
BACKUP=/etc/hosts.before-arc
BEGIN="# >>> keep-arc-alive: block Arc updates + remote flags"
END="# <<< keep-arc-alive"
DOMAINS=(
app.launchdarkly.com
mobile.launchdarkly.com
clientstream.launchdarkly.com
events.launchdarkly.com
releases.arc.net
releases.arc.net.s3.us-east-2.amazonaws.com
releases.browserinternal.com
)
if [ "$(id -u)" -ne 0 ]; then
echo "請用 sudo 執行:sudo bash $0 ${1:-}"
exit 1
fi
flush_dns() {
dscacheutil -flushcache
killall -HUP mDNSResponder
}
if [ "${1:-}" = "--undo" ]; then
[ -f "$BACKUP" ] || { echo "找不到 $BACKUP,無法還原"; exit 1; }
cp -p "$BACKUP" "$HOSTS"
flush_dns
echo "已還原 /etc/hosts(來源:$BACKUP)"
exit 0
fi
# 只在第一次備份,避免之後覆蓋掉原始版本
[ -f "$BACKUP" ] || cp -p "$HOSTS" "$BACKUP"
# 已經有舊的區塊就先拿掉,讓 script 可以重複執行
if grep -qF "$BEGIN" "$HOSTS"; then
sed -i '' "/^$BEGIN\$/,/^$END\$/d" "$HOSTS"
fi
{
echo "$BEGIN"
for d in "${DOMAINS[@]}"; do
echo "0.0.0.0 $d"
echo ":: $d"
done
echo "$END"
} >> "$HOSTS"
flush_dns
echo "已套用。原本的 hosts 備份在 $BACKUP"
echo "驗證(IPv4 應該是 0.0.0.0,IPv6 應該是 ::):"
for d in "${DOMAINS[@]}"; do
r=$(dscacheutil -q host -a name "$d")
v4=$(echo "$r" | awk '/^ip_address/ {print $2; exit}')
v6=$(echo "$r" | awk '/^ipv6_address/ {print $2; exit}')
printf " %-46s IPv4 %-10s IPv6 %s\n" "$d" "${v4:--}" "${v6:--}"
done
如果 script 放在 ~/Documents、~/Desktop、~/Downloads 底下,用 root 執行時會出現:
/bin/bash: .../arc-step2-hosts.sh: Operation not permitted (126)
這些資料夾受 TCC 保護,root 程式也沒有存取權限。另外,sudo 需要在 TTY 裡輸入密碼,從 AI agent 或非互動的 shell 執行會直接失敗(sudo: a password is required)。
解法是先把 script 複製到 /tmp,再用 macOS 的系統密碼視窗取得 root 權限 :
cp ~/Documents/path/to/arc-step2-hosts.sh /tmp/arc-step2-hosts.sh
osascript -e 'do shell script "/bin/bash /tmp/arc-step2-hosts.sh" with prompt "修改 /etc/hosts 以封鎖 Arc 的更新與遠端 flag 伺服器" with administrator privileges'
with administrator privileges 會跳出原生的密碼視窗,密碼只會交給 macOS。執行環境是 root,所以 script 裡的 id -u 檢查會通過。
如果你也在用 Dia:LaunchDarkly 網域是兩個瀏覽器共用的,用 hosts 擋會連 Dia 的 flag 一起凍結。這種情況就拿掉 4 個 LaunchDarkly 網域,只靠 Step 5 的覆寫。
不要用 hosts 擋 Firebase 。Google 的網域被太多服務共用,要擋的話請用 LuLu 或 Little Snitch 這類以 App 為單位的防火牆,只擋 Arc。
如果有用 Clash、Surge 這類 TUN 模式的代理工具,它們有自己的 DNS,可能會繞過 /etc/hosts(需確認)。
Step 7:驗證整體狀態 目的 :確認三層封鎖都有效,而且 Arc 跑過一輪之後設定沒有被蓋掉。
#!/bin/bash
echo "== 版本"
defaults read /Applications/Arc.app/Contents/Info.plist CFBundleShortVersionString
echo "== defaults(重開 Arc 後再跑一次,值應該不變)"
for k in SUEnableAutomaticChecks SUAutomaticallyUpdate shouldAutomaticallyUpdateArc \
transientFeatureFlagOverrides SULastCheckTime; do
printf " %-32s %s\n" "$k" "$(defaults read company.thebrowser.Browser $k 2>&1)"
done
echo "== 沒有等著安裝的更新"
ls ~/Library/Caches/company.thebrowser.Browser/org.sparkle-project.Sparkle/Installation 2>/dev/null | wc -l # 預期 0
echo "== hosts 區塊"
grep -c 'keep-arc-alive: block' /etc/hosts # 預期 1
echo "== 連線(被擋的應該是 000 / exit 7,對照組應該是 200)"
for u in https://releases.arc.net/updates.xml https://app.launchdarkly.com https://clientstream.launchdarkly.com; do
printf " %-42s " "$u"; curl -s -m 5 -o /dev/null -w "%{http_code}" "$u"; echo " (exit $?)"
done
printf " %-42s " "https://www.google.com"; curl -s -m 5 -o /dev/null -w "%{http_code}\n" https://www.google.com
項目 預期 實際 版本 1.170.0 1.170.0 4 個 defaults(Arc 執行中) 不變 不變 SULastCheckTime不再更新 停在套用前 等待安裝的更新 0 0 3 個被擋的網址 exit 7 exit 7 google.com 200 200
5. 快速開始
前提條件
實作步驟
確認版本
跑 Step 1 的 script,記下目前版本、等待安裝的更新、appcast 上的最新版。
升級到目標版本
Arc → Check for Updates,必要時跑兩輪。完成後跑 Step 2 的驗證。
確認 flag 存在
跑 Step 3 的 script,arc-force-sign-out-enabled 應該是 1。
完全關閉 Arc
pgrep -x Arc || echo "Arc 已關閉"
備份
跑 Step 4 的 script。
鎖設定
跑 Step 5 的 script。
封鎖伺服器
把 Step 6 的 script 存成 /tmp/arc-step2-hosts.sh,然後:
sudo bash /tmp/arc-step2-hosts.sh
重開 Arc,正常使用一下,關掉之後跑 Step 7 驗證。
測試驗證
緊急狀況 狀況 處理 被登出了 open --env ARC_E2E_TESTS=1 -a Arc(只在緊急時用,同步會關閉、Boosts 不顯示)想恢復更新 Step 5 的還原指令 + sudo bash /tmp/arc-step2-hosts.sh --undo 資料壞掉 關閉 Arc,從 ~/ArcBackup-YYYYMMDD/ 把檔案複製回原位
6. 不同技術棧的調整方式 如果你的 Arc 版本或使用情境跟上面不完全一樣,這邊整理了需要調整的部分。
高度通用的部分(直接用)
Sparkle 凍結手法 :任何用 Sparkle 自動更新的 macOS App,都能用 SUEnableAutomaticChecks / SUAutomaticallyUpdate = false 關掉更新,再用 hosts 擋掉 Info.plist 裡 SUFeedURL 的網域。
IPv4 + IPv6 雙封鎖 :任何用 hosts 擋網域的情境都應該同時寫 0.0.0.0 和 ::。
TCC + osascript 提權 :任何需要 root 執行、但 script 放在受保護資料夾的情境都適用。
靜態驗證 :先用 strings 確認設定 key 或 flag 名稱存在,再相信網路上的指南。
需要客製化的部分 部分 原實作 新情境需要調整的地方 目標版本 1.170.0(89123) 看 appcast 的 pubDate,選宣布關閉日之前的最新版 Flag 名稱 arc-force-sign-out-enabled、auto-updates-enabled用 Step 3 確認你的版本有沒有;新版可能多出別的 flag,需要逆向確認 封鎖網域 7 個 用 Step 3 的網域 grep 重新核對,有新的就加進 DOMAINS 陣列 備份範圍 關鍵 SQLite + JSON 如果你很依賴某些網站的離線資料(PWA),再加上 File System、IndexedDB Dia 共存 擋 LaunchDarkly 有用 Dia 就拿掉 LaunchDarkly 那 4 行
技術棧替換建議
如果你用 Windows 版 Arc :資料在 C:\Users\<User>\AppData\Local\Packages\TheBrowserCompany.Arc_ttt1ap7aakyb4\LocalCache\Local\Arc;hosts 在 C:\Windows\System32\drivers\etc\hosts,封鎖網域的做法相同。更新機制不是 Sparkle,defaults 那一步沒有對應做法,需確認。
如果你要凍結的是其他快停止服務的 App :流程一樣是「找更新來源 → 找遠端開關來源 → 本機覆寫 + 網路封鎖」。遠端開關常見的來源有 LaunchDarkly、Firebase Remote Config、Statsig,網域可以從 binary 的 strings 撈出來。
如果你用 Little Snitch / LuLu :可以完全不碰 /etc/hosts,改成只對 Arc 建立封鎖規則,精準度更高,也不會影響其他 App。
結語 整體來說,這套流程的核心不是什麼高深的逆向技巧,而是搞清楚「它會從哪裡被關掉」,然後一條一條堵起來,而且堵的方式都可以還原。我不敢說 12/22 那天一定不會出狀況,畢竟官方實際會怎麼關還沒人知道,但至少不會被一個靜悄悄推送的更新或遠端開關突然弄壞。長期來看,Chromium 停在 156 不會再有安全修補,所以銀行和重要帳號還是建議換到有在更新的瀏覽器。如果你也捨不得 Arc,希望這篇能幫你多爭取一點時間,慢慢找下一個家。
© 2026 GEEKAZ. All Rights Reserved.