comprobar el esquema de CloudKit antes de publicar

Un campo que esta en el @Model pero no en el esquema desplegado no sincroniza,
y no falla nada: los datos se quedan en el dispositivo que los escribio. Asi se
colaron nueve campos fuera de Production entre la 2.0 y la 2.1.2 sin que nadie
lo notara, incluidas las reglas de dia de las etiquetas y el desayuno/merienda
activados.

scripts/check_cloudkit_schema.py compara las propiedades almacenadas de cada
@Model con los CD_<campo> del esquema real (exportado con cktool), saltando
relaciones, computadas y el sufijo _ckAsset de los binarios.

fastlane submit y release abortan si falta algo; beta solo avisa, porque en
TestFlight es normal que el deploy a Production aun no se haya hecho. La lane
check_schema lo ejecuta suelto.

El deploy a Production sigue siendo manual: cktool no tiene subcomando y Apple
bloquea el endpoint de esquema en ese entorno.

Refs #38

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013su1ttRiMeMYxkZJ1Y3246
This commit is contained in:
alexandrev-tibco
2026-09-14 17:23:22 +02:00
parent 8b75f496f8
commit 75c41b12ec
3 changed files with 194 additions and 0 deletions
+37
View File
@@ -52,6 +52,43 @@ pass show admob/mealmood/app-id
pass show admob/mealmood/banner-home-unit-id
```
### Antes de mandar una versión a la App Store: comprobar el esquema de CloudKit
Un campo que está en el `@Model` pero no en el esquema de CloudKit **no
sincroniza**, y no falla nada: los datos se quedan en el dispositivo que los
escribió. Así se colaron nueve campos fuera de Production entre la 2.0 y la
2.1.2 (issue #38) — desayuno/merienda activados, sus horas, el recordatorio,
las fotos del planificador y las reglas de día de las etiquetas no viajaban
entre dispositivos.
```bash
fastlane check_schema # o directamente:
python3 scripts/check_cloudkit_schema.py --environment production
```
`fastlane submit` y `fastlane release` ya lo ejecutan y **abortan** si falta
algo; `fastlane beta` solo avisa (en TestFlight aún puede faltar el deploy).
Si faltan campos: el esquema de development solo se actualiza al ejecutar la
app contra ese entorno con iCloud activo, o importándolo a mano:
```bash
TOKEN=$(pass show apple/mealmood/cloudkit-token)
TEAM=$(pass show apple/mealmood/developer-team-id)
xcrun cktool export-schema --token "$TOKEN" --team-id "$TEAM" \
--container-id iCloud.com.alexandrev.mealmood --environment development \
--output-file /tmp/schema.ckdb
# añadir los CD_<campo> que falten (Bool/Int → INT64, String → STRING,
# Date → TIMESTAMP, Data → CD_<campo>_ckAsset ASSET) y:
xcrun cktool import-schema --token "$TOKEN" --team-id "$TEAM" \
--container-id iCloud.com.alexandrev.mealmood --environment development \
--file /tmp/schema.ckdb
```
El paso a Production **no se puede automatizar**: `cktool` no tiene deploy y
Apple bloquea el endpoint de esquema en ese entorno. Lo hace Alexandre en
CloudKit Console → Schema → *Deploy Schema Changes* → Deploy to Production.
### TestFlight upload
```bash
export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=$(pass show apple/mealmood/app-specific-password-fastlane)