創意營運與 iOS 發版常卡在 AppIcon.appiconset 內 PNG 與 Contents.json 不一致:合併前未爆雷,進 Xcode 或送審才炸。以下為 2026 可複現的遠端 Mac 劇本:配置 OpenClaw,跑批量校驗器比對實測像素與 JSON 期望,輸出 Markdown 修復報告,並可選 debounced 資料夾監聽 或 launchd 切片,讓設計交付自動化節奏穩定。槽位與點數對照請交叉閱讀遠端 Mac iOS 圖示交付決策矩陣。
為何資產目錄仍會漂移
- 倍率換算錯: 同一母圖複製到 2×/3× 卻未重算像素;檔名對上
Contents.json,幾何卻錯。 - JSON 過期: PNG 更名但未同步每一筆
images,產生孤兒或缺引用。 - 靜默改尺寸: 壓縮或補邊改變邊長,預覽仍看似正常。
在合併或上傳前加一道 gate,可把上述問題壓成報告單行,而不是半夜建置失敗。
自動化形態怎麼選
| 模式 | 適合情境 | 取捨 |
|---|---|---|
| 手動 CLI 單次 | 送審前稽核、臨時盤點 | 設定少;忙起來易忘記跑 |
| OpenClaw + debounced 監聽 | 設計師把匯出丟到遠端 Mac 共享 inbox | 須調靜默窗口,避免寫入未完成就校驗 |
OpenClaw + launchd 切片 |
每 15 分鐘或夜間固定批次 | 容量好排;距下一 tick 才有結果 |
安裝、配置與執行(五步)
- 安裝 OpenClaw 與輔助工具: 工作者機上依OpenClaw 全平台安裝指南部署;補齊
jq;確認sips -g pixelWidth -g pixelHeight能讀樣本 PNG。 - 鎖定目錄: 設定
APPICON_DIR=/path/to/AppIcon.appiconset、REPORT_PATH=./logs/appicon_fix_report.md;報告開頭寫入git rev-parse HEAD以利追溯。 - Lint JSON: 執行
plutil -lint Contents.json;語法錯誤會讓像素邏輯出假陰性,先修再量。 - 推算期望像素: 對含
filename的images[],解析size(如60x60)與scale(2x/3x);邊長=點數 × 整數倍率(2×→2、3×→3)。 - 量測與 diff: 逐檔讀實際寬高,不符則 append Markdown 列;若有任一 mismatch,程序以非零退出,讓 CI 或 OpenClaw 可隔離任務。
size 與 scale 推得的整數期望值,勿在 shell 裡硬編特殊案例。
監聽掛鉤與批處理腳本模板
Debounced 監聽: inbox/appicon/ 靜默約 45 秒後,複製到 work/ 跑校驗,通過則連同 report.md promote 至 out/,失敗則移 failed/。
批量切片: 白牌多 App 時可迴圈 Assets.xcassets 下所有 *.appiconset,夜間合併多份 Markdown 摘要。
校驗核心(Bash + jq + sips): 由 JSON 衍生期望寬高,再與 sips 讀值比對,輸出修復表。
#!/usr/bin/env bash
set -euo pipefail
DIR="${1:?path to AppIcon.appiconset}"
REPORT="${2:-./appicon_validation_report.md}"
JSON="$DIR/Contents.json"
{
echo "# AppIcon validation"
echo "- host: $(hostname)"
echo "- path: $DIR"
echo ""
echo "| filename | expected | actual | status |"
echo "|---|---:|---:|---|"
} > "$REPORT"
while read -r name w h; do
[[ -z "${name:-}" ]] && continue
fp="$DIR/$name"
if [[ ! -f "$fp" ]]; then
echo "| $name | ${w}x${h} | missing | FIX: add file |" >> "$REPORT"
continue
fi
read -r aw ah < <(sips -g pixelWidth -g pixelHeight "$fp" \
| awk '/pixelWidth/ {w=$2} /pixelHeight/ {print w, $2}')
if [[ "$aw" -eq "$w" && "$ah" -eq "$h" ]]; then
echo "| $name | ${w}x${h} | ${aw}x${ah} | OK |" >> "$REPORT"
else
echo "| $name | ${w}x${h} | ${aw}x${ah} | FIX: re-export |" >> "$REPORT"
fi
done < <(jq -r '.images[] | select(.filename!=null)
| [.filename,
((.size|split("x")[0]|tonumber) * (.scale|sub("x";"")|tonumber)),
((.size|split("x")[1]|tonumber) * (.scale|sub("x";"")|tonumber))]
| @tsv' "$JSON")
echo "Wrote $REPORT"
若含僅 iPad、或缺少 scale 的列,請延伸 jq 過濾器;始終以 JSON 推算期望像素。幾何通過後,可再疊加 PNG 批量質檢 檢 alpha、ICC 與體積上限。
fswatch 監聽骨架(需自行安裝 fswatch;靜默邏輯可換 sleep 迴圈判斷 mtime):
#!/usr/bin/env bash
# 觸發後等待靜默再跑校驗,避免半寫入檔案
INBOX="${APPICON_INBOX:-$HOME/inbox/appicon}"
VALIDATE="./validate_appicon.sh"
quiet_run() {
sleep 45
"$VALIDATE" "$INBOX/work/AppIcon.appiconset" "$INBOX/reports/$(date +%Y%m%d-%H%M).md"
}
fswatch -o "$INBOX" | while read -r _; do quiet_run & done
可引用的數字與策略
- 經典槽位倍率: 1×/2×/3× 對應乘數 1、2、3,與
Contents.json點數相乘即 PNG 邊長。 - 靜默 debounce: 網路掛載或 GUI 匯出環境下,30–60 秒無新位元組再跑較穩。
- 報告保留:
logs/旁保留約 30 天 Markdown 或 JSONL,發版經理可 diff 建置間差異而不必開 Xcode。
FAQ:常見錯誤
jq: error 或 parse error 讀 Contents.json
先跑 plutil -lint;清掉合併衝突標記,確保 UTF-8 無 BOM。必要時 python3 -m json.tool 定位壞行。
sips 讀不到 PNG
可能零位元組、副檔名偽裝的 WebP、或仍在寫入。強制靜默窗口、拒空檔;若外掛支援可加 .done sidecar。
量測都對,Xcode 仍抱怨
檢查 idiom 專用列、1024 行銷資產 alpha 政策、以及部署目標必填槽位。幾何校驗是必要條件,非 App Store 政策充分條件。
為何 Finder 正常、校驗卻失敗?
預覽會縮放;請只信 sips 數值與 JSON 推算,必要時對照圖示交付矩陣核對角色與倍率。
把此流程固定在專用遠端 Mac,筆電專心創意,OpenClaw 負責離峰校驗。更多自動化主題見技術見解列表。
部署 App Icon 校驗工作者:先比節點與租用方式
開啟 MacPng 站內定價與購買/租用頁面無需註冊登入即可瀏覽;連線與環境準備請見幫助中心,將同一套腳本貼上租用的遠端主機即可跑通。