Commit f93ab096 authored by Kourser's avatar Kourser
Browse files

fix(app-store): macOS shots via screencapture (fixes empty capture areas)



cacheDisplay (-uiCapture) leaves large empty areas on SwiftUI list/scroll
content though the window looks fine on screen. Switch the script to
screencapture -l<windowID> (real on-screen pixels) — needs Screen Recording
permission on the user's Terminal — while keeping the direct-launch trick for
-AppleLanguages. Adds the settings screen back to the set.

Co-Authored-By: default avatarClaude Opus 4.8 <noreply@anthropic.com>
parent ea53e60c
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -131,11 +131,15 @@ The app collects no personal data (see the privacy manifest).
  pour l'instant (adaptables : mentionner menus, raccourcis clavier, Touch Bar).
  Upload : `fastlane deliver --platform osx --metadata_path fastlane/metadata_macos --screenshots_path fastlane/screenshots_macos`.
- **Captures** : `fastlane/screenshots_macos/` — à générer avec
  `./fastlane/generate_shots_macos.sh`. Le mode DEBUG `-uiCapture` (fichier
  `Skingomz/DemoCapture.swift`) photographie la fenêtre via `cacheDisplay`, **sans
  permission Enregistrement de l'écran**. ⚠️ **À lancer dans une session graphique
  interactive** : la génération headless échoue (l'app ne rend pas sa fenêtre hors
  session Aqua interactive). Vérifie la première capture avant de laisser tourner.
  `./fastlane/generate_shots_macos.sh`, **dans ton Terminal** (session graphique).
  Le script lance le binaire directement (langue via `-AppleLanguages`, que
  `open --args` ne transmet pas) et capture les VRAIS pixels à l'écran via
  `screencapture` — ce qui **exige la permission « Enregistrement de l'écran »
  pour ton Terminal** (Réglages Système > Confidentialité et sécurité →
  coche ton Terminal, RELANCE-le). Le mode interne `-uiCapture`/`cacheDisplay`
  ([Skingomz/DemoCapture.swift](../Skingomz/DemoCapture.swift)) existe comme
  repli sans permission, mais laisse des zones vides sur le contenu SwiftUI →
  `screencapture` est préféré. Vérifie `fr-FR/` et `ja/` avant de tout lancer.

> ⚠️ Rappel distribution : l'app Mac « native » est distribuée en **Developer ID**
> (téléchargement GitLab), pas sur le Mac App Store. La présence Mac sur l'App
+41 −19
Original line number Diff line number Diff line
#!/usr/bin/env bash
#
# Captures App Store macOS localisées (22 langues) via le mode DEBUG -uiCapture,
# qui photographie la fenêtre avec cacheDisplay — SANS permission « Enregistrement
# de l'écran ».
# Captures App Store macOS localisées (22 langues).
#
#   ./fastlane/generate_shots_macos.sh
#
# ⚠️ À LANCER DANS TA SESSION GRAPHIQUE INTERACTIVE (pas via SSH / agent headless) :
# l'app doit pouvoir créer sa fenêtre et rendre son contenu.
# ⚠️ À LANCER DANS TON TERMINAL (session graphique) : l'app doit afficher sa
#    fenêtre, et `screencapture` requiert la permission « Enregistrement de
#    l'écran » pour CE Terminal (Réglages Système > Confidentialité et sécurité
#    > Enregistrement de l'écran → coche ton Terminal, puis RELANCE-le).
#
# Recette (apprise à la dure) :
#   - le seed (-uiSeed) BLOQUE le flux de capture s'il est combiné → on sème UNE
#     fois d'abord, puis on capture sans -uiSeed (les données persistent) ;
#   - IMPORTANT : `open --args -AppleLanguages` N'EST PAS honoré → on lance le
#     BINAIRE DIRECTEMENT ("$APP/Contents/MacOS/Skingomz") avec -AppleLanguages,
#     ce qui place bien la langue dans le domaine argument de NSUserDefaults.
# Méthode (après beaucoup d'essais) :
#   - langue : on lance le BINAIRE DIRECTEMENT avec -AppleLanguages "(xx)"
#     (`open --args` ne transmet pas cet argument) ;
#   - rendu : on capture les VRAIS pixels à l'écran avec `screencapture -l<id>`
#     (le mode interne -uiCapture/cacheDisplay laissait de grandes zones vides
#     avec le contenu SwiftUI) ;
#   - seed : -uiSeed bloque la capture s'il est combiné → on sème UNE fois
#     d'abord, puis on capture sans -uiSeed (données persistées).
set -uo pipefail
cd "$(dirname "$0")/.."
export DEVELOPER_DIR="${DEVELOPER_DIR:-/Applications/Xcode.app/Contents/Developer}"

OUT="fastlane/screenshots_macos"
DD="build/dd-macos-shots"
HERE="build/appstore-screenshots"     # compose.swift
HERE="build/appstore-screenshots"          # find_window.swift + compose.swift
RAW="$(mktemp -d)/raw.png"

# Permission requise pour screencapture d'une fenêtre.
if [ "$(swift -e 'import CoreGraphics; print(CGPreflightScreenCaptureAccess())' 2>/dev/null)" != "true" ]; then
  echo "✗ Permission « Enregistrement de l'écran » manquante pour ce Terminal."
  echo "  Réglages Système > Confidentialité et sécurité > Enregistrement de l'écran"
  echo "  → coche ton Terminal, RELANCE-le, puis relance ce script."
  exit 1
fi

# asc : code AppleLanguages : AppleLocale
LOCALES=(
  "fr-FR:fr:fr_FR" "en-US:en:en_US" "de-DE:de:de_DE" "es-ES:es:es_ES" "it:it:it_IT"
@@ -31,7 +41,7 @@ LOCALES=(
  "da:da:da_DK" "fi:fi:fi_FI" "el:el:el_GR" "hu:hu:hu_HU" "ro:ro:ro_RO" "sk:sk:sk_SK"
  "cs:cs:cs_CZ" "hr:hr:hr_HR" "zh-Hans:zh-Hans:zh_CN" "ja:ja:ja_JP" "ko:ko:ko_KR" "ru:ru:ru_RU"
)
SCREENS=( "01-library:" "02-inbox:inbox" "03-detail:detail" "04-queue:queue" )
SCREENS=( "01-library:" "02-inbox:inbox" "03-detail:detail" "04-queue:queue" "05-settings:settings" )

echo "▶︎ Build Debug macOS…"
APP=$(find "$DD/Build/Products" -name 'Skingomz.app' -type d 2>/dev/null | head -1)
@@ -45,6 +55,8 @@ BIN="$APP/Contents/MacOS/Skingomz"

quit() { pkill -9 -f "Skingomz.app/Contents/MacOS/Skingomz" 2>/dev/null || true; sleep 1; }

win_id() { swift "$HERE/find_window.swift" Skingomz 2>/dev/null | awk 'NR==1{print $1}'; }

echo "▶︎ Seed unique (données démo persistées)…"
quit
"$BIN" -uiSeed >/dev/null 2>&1 &
@@ -58,16 +70,26 @@ for entry in "${LOCALES[@]}"; do
    IFS=":" read -r fname arg <<< "$sc"
    quit; rm -f "$RAW"
    if [ -z "$arg" ]; then
      "$BIN" -uiCapture "$RAW" -AppleLanguages "($code)" -AppleLocale "$loc" >/dev/null 2>&1 &
      "$BIN" -AppleLanguages "($code)" -AppleLocale "$loc" >/dev/null 2>&1 &
    else
      "$BIN" -uiScreen "$arg" -uiCapture "$RAW" -AppleLanguages "($code)" -AppleLocale "$loc" >/dev/null 2>&1 &
      "$BIN" -uiScreen "$arg" -AppleLanguages "($code)" -AppleLocale "$loc" >/dev/null 2>&1 &
    fi
    i=0; until [ -s "$RAW" ] || [ "$i" -ge 20 ]; do sleep 1; i=$((i+1)); done
    if [ ! -s "$RAW" ]; then echo "  ✗ $asc/$fname"; continue; fi
    # attendre la fenêtre + le rendu du contenu
    NUM=""; i=0; until [ -n "$NUM" ] || [ "$i" -ge 30 ]; do NUM=$(win_id); [ -n "$NUM" ] && break; sleep 1; i=$((i+1)); done
    [ -n "$NUM" ] || { echo "  ✗ $asc/$fname : pas de fenêtre"; continue; }
    osascript -e 'tell application "Skingomz" to activate' >/dev/null 2>&1 || true
    # agrandir/centrer (best-effort ; nécessite Accessibilité, sinon taille par défaut)
    osascript -e 'tell application "System Events" to tell process "Skingomz" to set size of front window to {1280, 800}' >/dev/null 2>&1 || true
    osascript -e 'tell application "System Events" to tell process "Skingomz" to set position of front window to {160, 120}' >/dev/null 2>&1 || true
    sleep 3
    NUM=$(win_id)
    screencapture -x -o -l"$NUM" "$RAW" 2>/dev/null
    if [ ! -s "$RAW" ]; then echo "  ✗ $asc/$fname : capture vide"; continue; fi
    W=$(sips -g pixelWidth "$RAW" | awk '/pixelWidth/{print $2}')
    CW=2880; CH=1800; [ "$W" -le 1440 ] && { CW=1440; CH=900; }
    H=$(sips -g pixelHeight "$RAW" | awk '/pixelHeight/{print $2}')
    CW=2880; CH=1800; [ "$W" -le 1440 ] && [ "$H" -le 900 ] && { CW=1440; CH=900; }
    swift "$HERE/compose.swift" "$RAW" "$OUT/$asc/mac-${fname}.png" "$CW" "$CH" >/dev/null \
      && echo "  ✓ $asc/mac-${fname}.png" || echo "  ✗ compose $asc/$fname"
      && echo "  ✓ $asc/mac-${fname}.png (${CW}x${CH})" || echo "  ✗ compose $asc/$fname"
  done
  echo "[$asc] ✓"
done