Les creative ops et release managers iOS perdent encore des heures lorsque les PNG de AppIcon.appiconset ne correspondent pas à Contents.json, provoquant des échecs Xcode tardifs et des surprises App Store. Voici un playbook 2026 sur Mac distant : configurer OpenClaw, exécuter un validateur par lot qui compare pixels mesurés et attentes JSON, produire un rapport Markdown de correctifs, et optionnellement brancher une surveillance de dossier débouncée ou une tranche launchd pour que l’automatisation de livraison design reste prévisible. Croisez le calcul des slots avec notre matrice de livraison des icônes iOS (PNG, Contents.json, sRGB).
Sommaire
Pourquoi le catalogue dérive encore
- Erreurs de calcul d’échelle : un master est dupliqué en 2× et 3× sans recalculer les pixels ; les noms dans
Contents.jsonrestent cohérents alors que la géométrie ne l’est pas. - JSON obsolète : renommage des PNG sans mise à jour de chaque entrée
images→ fichiers orphelins et références manquantes. - Redimensionnements silencieux : optimiseurs ou étapes de padding modifient les bords pendant que les aperçus restent « plausibles ».
Un portillon avant fusion ou upload transforme ces problèmes en lignes de rapport au lieu de cassures de build à minuit.
Choisir la forme d’automatisation
| Mode | Idéal quand | Compromis |
|---|---|---|
| CLI manuelle | Audit ponctuel avant soumission App Store | Faible effort ; facile à oublier sous pression |
| OpenClaw + watch débouncé | L’équipe design dépose les exports dans une boîte partagée sur le Mac distant | Réglage de la fenêtre de calme pour éviter les écritures partielles |
OpenClaw + tranche launchd |
Lots prévisibles toutes les 15 minutes ou la nuit | Planification simple ; léger délai jusqu’au prochain tick |
Pour l’outillage OpenClaw de base (installation, variables, premiers jobs), appuyez-vous sur le guide installation OpenClaw toutes plateformes afin d’aligner versions et chemins sur le worker distant.
Installer, configurer, exécuter (cinq gestes)
- Installer OpenClaw et utilitaires : sur le worker, bootstrap standard du projet ; ajouter
jq; vérifiersips -g pixelWidth -g pixelHeightsur des PNG témoins. - Cibler le catalogue : exporter
APPICON_DIR=/chemin/vers/AppIcon.appiconsetetREPORT_PATH=./logs/rapport_appicon.md. Notergit rev-parse HEADen tête de rapport pour la traçabilité. - Linter
Contents.json:plutil -lint Contents.json. Corriger la syntaxe avant toute logique pixel — un JSON mal formé produit des faux négatifs. - Calculer les pixels attendus : pour chaque
images[]avecfilename, parsersize(ex.60x60) etscale(ex.2x). La longueur de côté attendue = points de base × facteur entier (2× → 2, 3× → 3). - Mesurer et diff : pour chaque PNG référencé, lire largeur et hauteur réelles ; ajouter une ligne Markdown en cas d’écart ; code de sortie non nul si échec restant pour que la CI ou OpenClaw mette le job en quarantaine.
Gabarits surveillance et script batch
Watch débouncé : après ~45 s de calme sur inbox/appicon/, copier vers work/, valider, promouvoir vers out/ avec report.md, ou déplacer les échecs vers failed/.
Batch multi-marques : boucler tous les *.appiconset sous Assets.xcassets ; concaténer les rapports Markdown nocturnes pour un tableau de bord release.
#!/usr/bin/env bash
set -euo pipefail
DIR="${1:?chemin AppIcon.appiconset}"
REPORT="${2:-./rapport_validation_appicon.md}"
JSON="$DIR/Contents.json"
{
echo "# Validation AppIcon"
echo "- hôte: $(hostname)"
echo "- chemin: $DIR"
echo ""
echo "| fichier | attendu | mesuré | statut |"
echo "|---|---:|---:|---|"
} > "$REPORT"
while read -r name w h; do
[[ -z "${name:-}" ]] && continue
fp="$DIR/$name"
if [[ ! -f "$fp" ]]; then
echo "| $name | ${w}x${h} | manquant | CORRIGER: ajouter le fichier |" >> "$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} | CORRIGER: ré-exporter |" >> "$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 "Écrit : $REPORT"
Étendez le filtre jq pour les lignes ipad ou scale implicites ; dérivez toujours les pixels attendus depuis le JSON. Une fois la géométrie verte, enchaînez avec la QA PNG OpenClaw par lot (alpha, ICC, octets).
Chiffres et politiques utiles
- Échelles classiques : 1× / 2× / 3× correspondent aux multiplicateurs 1, 2 et 3 sur la longueur de côté dérivée de
sizedansContents.json. - Debounce et rétention : trente à soixante secondes de calme sur l’arborescence surveillée ; conserver ~30 jours de Markdown ou JSONL dans
logs/pour l’historique release.
FAQ : erreurs fréquentes
jq: error ou erreur de parse sur Contents.json
Lancer d’abord plutil -lint. Retirer marqueurs de conflit Git et garantir UTF-8 sans BOM problématique. Valider contre un gabarit Xcode neuf si besoin.
sips ne lit pas le PNG
Fichier vide, WebP renommé en .png, ou écriture en cours. Appliquer la fenêtre de calme, rejeter les zéro octet, exiger un sidecar .done si l’outil d’export le permet.
Tout mesure correct mais Xcode se plaint encore
Vérifier les lignes par idiom, l’alpha sur l’asset marketing 1024, et les slots obligatoires pour votre cible de déploiement. La validation géométrique est nécessaire mais pas suffisante pour les règles App Store.
Exécutez ce flux sur un Mac distant dédié pour libérer les portables créatifs pendant qu’OpenClaw enchaîne les contrôles nocturnes. Parcourez la liste des articles du blog pour des guides d’automatisation adjacents.
Comparez les nœuds Mac et déployez votre worker de validation App Icon
Pour une durée limitée, ouvrez les pages tarifs et nœuds et location / achat sur MacPng sans créer de compte, puis suivez l’aide SSH/VNC pour coller les mêmes scripts sur votre hôte loué.