# Pubblicare un'app: Google Play e App Store

Il percorso fatto con Quanto Basta (settembre 2026), scritto per rifarlo con
le app successive. I dettagli di Quanto Basta stanno nel suo repository
(`docs/BUILD.md`, `docs/store/`): qui c'è quello che vale per tutte.

## Prima di tutto, sul sito

Gli store vogliono due indirizzi, e li mettiamo su duebytes.it (istruzioni in
`_private/duebytes/CLAUDE.md`, sezione «Pagine delle app»):

- **assistenza**: `https://www.duebytes.it/<app>/`, in italiano e inglese;
- **informativa privacy**: `https://www.duebytes.it/<app>/privacy/`.

Poi l'app va aggiunta alla **pagina dei tester** `https://www.duebytes.it/beta/`
seguendo `_private/duebytes/beta/LEGGIMI.md`. È l'unico indirizzo che Paolo dà
ai tester: non si invita nessuno uno a uno.

## Firmare le build

**Android.** Google tiene la chiave di firma vera (Play App Signing); noi
firmiamo con una **chiave di caricamento**, una per app, creata con `keytool`
e tenuta fuori dal repository, accanto al progetto:
`_private/ - App/<App> - firma Android/` con `upload.keystore` e
`credenziali.txt`. La build la trova con le proprietà
`<PREFISSO>_UPLOAD_STORE_FILE`, `_STORE_PASSWORD`, `_KEY_ALIAS`,
`_KEY_PASSWORD` in `~/.gradle/gradle.properties` (`QB_` per Quanto Basta,
`FW_` per Faraway). Con Expo le mette nel `build.gradle` un plugin
(`plugins/with-android-upload-key.js` di Quanto Basta), perché `android/` si
rigenera a ogni prebuild. Controllo prima di caricare:
`keytool -printcert -jarfile app-release.aab` deve dare l'impronta della
chiave di caricamento, non quella di debug.

**iOS.** Firma automatica col team `686XK96PF6` («Paolo Alberti»). Archivio e
caricamento su App Store Connect da terminale, senza aprire Xcode:

```bash
xcodebuild -workspace <App>.xcworkspace -scheme <App> -configuration Release \
  -destination 'generic/platform=iOS' -archivePath build/<App>.xcarchive archive \
  -allowProvisioningUpdates DEVELOPMENT_TEAM=686XK96PF6 CODE_SIGN_STYLE=Automatic
xcodebuild -exportArchive -archivePath build/<App>.xcarchive \
  -exportOptionsPlist "/Users/paolo/Server/Siti Web/_private/ - App/comune/ios/ExportOptions.plist" \
  -exportPath build/export -allowProvisioningUpdates
```

Ogni caricamento vuole un numero di build nuovo (iOS `CFBundleVersion`,
Android `versionCode`). Gli avvisi sui dSYM dei framework precompilati non
bloccano niente.

## Google Play

Account **personale** «Paolo Alberti - Duebytes», ID `8440704338946855239`,
proprietario `paoloalby@gmail.com`, email pubblica
`paolo.alberti@duebytes.it`, sito `https://www.duebytes.it`. Verifiche di
identità, dispositivo e telefono già passate.

1. **Crea app**: italiano come lingua predefinita, gratuita o a pagamento. Una
   app gratuita **non potrà più diventare a pagamento** (gli acquisti in-app
   restano possibili): per un'app a pagamento va scelto subito.
2. **Contenuti app**: norme sulla privacy (l'URL sopra), annunci, accesso,
   ID pubblicità, pubblico di destinazione, sicurezza dei dati,
   classificazione IARC. Le risposte date per Quanto Basta sono in
   `QuantoBasta/docs/store/google-play.md`: tenerle uguali a quelle di App
   Store Connect («App Privacy»).
3. **Scheda dello Store**: nome (uguale a quello dell'App Store), descrizione
   breve e completa, icona 512×512, immagine in evidenza 1024×500 senza
   trasparenza, screenshot del telefono **e** dei tablet 7" e 10" (sezioni a
   parte: le slide del tablet vanno fatte col tablet, vedi
   `comune/carosello/`). Alla fine chiede se ci sono immagini fatte con l'IA.
4. **Test chiuso**. Con l'account personale, prima della produzione Google
   vuole **almeno 12 tester iscritti per 14 giorni di fila** nel test chiuso
   (il test interno non conta). I tester sono un **gruppo Google**
   `tester-<app>@googlegroups.com`: chiunque può entrare, pubblicano solo i
   gestori. Il test chiuso in tutti i paesi, con il gruppo come tester.
5. **Release**: l'AAB supera i 10 MB, quindi **lo trascina Paolo** nella
   pagina (Claude lo prepara sulla Scrivania). Note di rilascio fra
   `<it-IT>` e `</it-IT>`. Poi Panoramica della pubblicazione → Invia per la
   revisione. L'avviso sul file di deoffuscamento non blocca.

Trappole di Play Console:
- a volte dà «errore imprevisto» e rimbalza all'elenco delle app (che resta
  vuoto): si riapre la dashboard dell'app e si passa dal menu a sinistra;
- nella scheda gli screenshot si scelgono da una libreria: aggiungerli **uno
  alla volta** (freccia → Aggiungi) li mette in ordine; tutti insieme escono in
  ordine casuale e poi vanno trascinati. Dare nomi distinti ai file (es.
  `tablet-1.png`), perché la libreria è condivisa fra le sezioni.

## App Store Connect

Team individuale «Paolo Alberti» `686XK96PF6`. A livello di account è già
fatto tutto (settembre 2026): operatore commerciale per il DSA (indirizzo di
casa e cellulare, verificati con la visura camerale), DAC7 attiva, conto
Revolut. Per un'app **a pagamento** va firmato il contratto «Paid Apps» in
Accordi (non ancora firmato a settembre 2026).

1. **Bundle ID** nel portale developer (`it.duebytes.<app>`), poi la nuova
   app. Il nome deve essere unico in tutto lo store, anche fra le app mai
   pubblicate: se è preso, si aggiunge un sottotitolo al nome («Quanto Basta:
   Dosaricette»); sotto l'icona resta il nome corto.
2. **Privacy dell'app**, **informazioni sull'app** (categoria, età),
   **prezzo e disponibilità**.
3. **TestFlight**: informazioni per i test (email per i riscontri, contatti
   per il revisore con un numero di telefono, che mette Paolo), gruppo interno
   «Interni» con Paolo, gruppo esterno «Beta tester» con il **link pubblico**
   (va sulla pagina dei tester). La prima build del gruppo esterno passa la
   verifica beta di Apple (in giornata); le build successive della stessa
   versione di solito sono approvate subito. Una build nuova entra da sola nel
   gruppo interno; in quello esterno si aggiunge a mano, con le note «cosa
   provare».
4. **Versione per lo store**: schermate 6,9" (le slide `ios`), testi, parole
   chiave, URL di assistenza, copyright «2026 Paolo Alberti», build, rilascio
   manuale. Poi «Aggiungi alla verifica».

## Cosa fa Paolo e cosa fa Claude

Claude prepara tutto e compila i moduli nel browser. Paolo fa quello che
Claude non può fare: password e accessi, CAPTCHA, dati bancari e documenti,
accettare contratti e condizioni, caricare file oltre i 10 MB. I pulsanti che
inviano o pubblicano (invia per la revisione, aggiungi alla verifica) li
preme Claude solo se Paolo lo dice in quel momento.
