v1.0.0 ← Torna al sito

📱 ShopApp — Documentazione

App mobile white-label per PrestaShop 8. Flutter + OneSignal + Riverpod. Personalizzabile per qualsiasi negozio in 5 minuti.

ShopApp è un'applicazione mobile completa per iOS e Android che si connette a qualsiasi negozio PrestaShop 8 tramite Admin API OAuth2. Include un modulo PHP che estende PrestaShop con autenticazione cliente, gestione ordini e notifiche push OneSignal.

💡
Questa documentazione copre: configurazione white-label, installazione del modulo PS, setup OneSignal, e pubblicazione su App Store e Google Play.

Funzionalità incluse

  • 🛍️ Catalogo prodotti — browse per categoria, ricerca, filtri, immagini ottimizzate
  • 🔐 Autenticazione cliente — login e registrazione con le stesse credenziali del sito
  • 🛒 Carrello — gestione locale con sync al checkout, swipe-to-delete
  • 📦 Ordini — lista ordini con timeline animata, dettaglio completo
  • 🔔 Notifiche push — OneSignal per ordini e promozioni
  • 🎨 White-label — colori, nome e URL configurabili via JSON
  • Performance nativa — Flutter compila in codice nativo ARM

✅ Requisiti

Ambiente di sviluppo

ToolVersione minimaVersione testataNote
Flutter SDK≥ 3.19.03.35.6 (stable)Genera build.gradle.kts (Kotlin DSL)
Dart≥ 3.2.03.9.2Incluso in Flutter
Android StudioHedgehog+Per build Android
Xcode≥ 15.0Solo macOS, per build iOS
CocoaPods≥ 1.14Solo macOS, per iOS

Backend PrestaShop

ComponenteVersioneNote
PrestaShop≥ 8.0.0Admin API OAuth2 richiesta
PHP≥ 8.1
MySQL≥ 5.7
HTTPSRichiesto per iOS App Transport Security

Account necessari

  • OneSignal — gratuito su onesignal.com
  • Google Play Console — 25$ una tantum, per pubblicare su Android
  • Apple Developer Program — 99$/anno, per pubblicare su iOS

📁 Struttura del progetto

mobile_app/
├── pubspec.yaml — dipendenze Flutter
├── assets/config/
│ └── app_config.json ← 6 campi: app_name, bundle_id, credenziali
├── assets/images/
│ └── launcher_icon.png ← scaricato da configure.dart (logo PS)
├── scripts/
│ └── configure.dart ← imposta nome, bundle ID e scarica icona
└── lib/
├── main.dart — entry point
├── core/
├── config/app_config.dart — carica JSON
├── network/api_client.dart — HTTP + OAuth2
├── services/storage_service.dart — token storage
├── services/onesignal_service.dart — push notifications
└── theme/app_theme.dart — Material3 theme
├── models/ — Product, Category, Order, Customer, CartItem
├── providers/ — Riverpod state (auth, products, cart, orders)
├── screens/ — Home, Products, Detail, Cart, Orders, Profile...
├── widgets/ — ProductCard, CategoryChip, PromoBanner
└── router/app_router.dart — go_router navigation
modules/mobilenotifications/ ← modulo PrestaShop
├── mobilenotifications.php — modulo principale + hook + admin
└── controllers/front/
├── auth.php — login/registrazione cliente
├── fcm.php — registrazione OneSignal player ID
└── orders.php — ordini + checkout

⚙️ Installazione Flutter

1
Installa Flutter SDK

Scarica da flutter.dev e aggiungi al PATH.

2
Entra nella cartella del progetto

Sostituisci il percorso con quello reale sul tuo computer:

# macOS / Linux
cd ~/Progetti/shopapp

# Windows
cd C:\Progetti\shopapp
3
Installa le dipendenze
flutter pub get
4
Verifica l'ambiente
flutter doctor -v
5
Configura per il cliente (nome, icona, bundle ID)

Modifica i 6 campi in assets/config/app_config.json, poi lancia lo script:

dart run scripts/configure.dart

Scarica il logo dal modulo PS, patcha i file Android/iOS e genera assets/images/launcher_icon.png.

6
Genera le icone launcher
dart run flutter_launcher_icons

Crea tutte le risoluzioni dell'icona per Android (7 densità + adaptive) e iOS (14 dimensioni).

7
Avvia in modalità debug
flutter run
💡
I passi 5 e 6 vanno ripetuti una volta per ogni nuovo cliente. Il passo 7 è solo per test in sviluppo.

🎨 Configurazione white-label

Il branding (nome, logo, colori) si gestisce direttamente dal pannello PrestaShop. L'app si aggiorna al prossimo avvio, senza rebuild.

Come funziona

All'avvio, l'app carica prima i valori di fallback dal file locale app_config.json, poi chiama automaticamente l'endpoint del modulo PrestaShop e sovrascrive nome, logo e colori con i valori aggiornati dal cliente.

🚀
Il cliente cambia logo o colori da PrestaShop → l'app si aggiorna da sola. Non serve rebuild, non serve redistribuire l'app sugli store.

Cosa gestisce il cliente (da PrestaShop Admin)

CampoDoveEffettoRebuild?
Nome negozio in-appModulo → Configurazione AppSplash screen, header, notifiche pushNo
TaglineModulo → Configurazione AppSottotitolo nella splash screenNo
LogoModulo → Configurazione App → uploadIn-app: splash screen immediata. Icona launcher: dopo rebuild con configure.dartPer icona launcher
Colore principaleModulo → Configurazione App → color pickerPulsanti, link, accenti, tema Material3No
Colore secondarioModulo → Configurazione App → color pickerBadge sconto, accenti secondariNo
ValutaModulo → Configurazione AppSimbolo e codice ISO nei prezziNo
Bundle IDModulo → Configurazione App (annotazione)Solo promemoria per il developer
🖼️
Il logo caricato nel modulo ha doppio uso: appare subito dentro l'app (splash screen) senza rebuild. Per aggiornare anche l'icona sulla home del telefono basta rieseguire dart run scripts/configure.dart + dart run flutter_launcher_icons + rebuild.

Cosa resta in app_config.json

Solo le credenziali bootstrap e i dati build-time. Tutto il branding lo gestisce il modulo PS.

// assets/config/app_config.json — l'unico file che tocchi per cliente
{
  "app_name":          "Fashion Store",         // nome launcher (script configure)
  "bundle_id":         "com.fashionstore.app",  // bundle ID (script configure)
  "base_url":          "https://fashionstore.it/prestashop",
  "api_client_id":     "app-flutter2026",
  "api_client_secret": "la-tua-secret",
  "onesignal_app_id":  "xxxx-yyyy-zzzz"
}
🔄
Nome in-app, logo, colori, valuta, lingua, prodotti per pagina — tutto il resto viene dal modulo PrestaShop e si aggiorna senza rebuild.

Endpoint configurazione app

GET/module/mobilenotifications/configPubblico — nessuna autenticazione
Chiamato automaticamente da Flutter all'avvio. Restituisce tutti i valori white-label aggiornati.

Risposta:
// Esempio risposta
{
  "success": true,
  "config": {
    "store_name": "Fashion Store",
    "store_tagline": "Le migliori offerte di moda",
    "logo_url": "https://negozio.it/img/mobile/app_logo.png",
    "primary_color": "#E91E8C",
    "secondary_color": "#FF6584",
    "currency_symbol": "€",
    "currency_code": "EUR",
    "language_id": 1,
    "products_per_page": 20,
    "show_ratings": true,
    "enable_wishlist": true
  }
}

Dove trovare le credenziali Admin API

1
PrestaShop Admin

Vai in Configurazione avanzata → API Client

2
Crea o copia

Copia Client ID e Client Secret nel file app_config.json.

3
Attiva tutti gli scope

Seleziona tutti gli scope disponibili per il client.

⚠️
Non condividere app_config.json — contiene le credenziali API. Non caricarlo su repository pubblici.

🛒 Modulo PrestaShop

Il modulo mobilenotifications estende PrestaShop con API REST per clienti, OneSignal e hook per notifiche automatiche.

📦
mobilenotifications.zip Modulo PrestaShop completo — auth, ordini, OneSignal, pannello admin
⬇ Scarica modulo

Installazione

1
Carica la cartella

Copia modules/mobilenotifications/ in prestashop/modules/ sul tuo server.

2
Installa da admin

Vai in Moduli → Gestione moduli, cerca "Mobile App Notifications" e clicca Installa.

3
Configura OneSignal

Dal pannello di configurazione del modulo inserisci App ID e REST API Key di OneSignal.

ℹ️
L'installazione crea automaticamente due tabelle nel database: mobile_tokens (OneSignal player IDs per cliente) e mobile_notifications_log (log notifiche inviate).

Hook registrati

HookAzione
actionOrderStatusUpdateNotifica push al cliente ad ogni cambio stato ordine
actionObjectOrderAddAfterNotifica "Ordine confermato" alla creazione

Permessi file

# Sul server
chown -R www-data:www-data modules/mobilenotifications/
chmod -R 755 modules/mobilenotifications/

🔔 Setup OneSignal

Creazione dell'app OneSignal

1
Crea account

Registrati su onesignal.com (piano gratuito)

2
New App/Website

Scegli Mobile App e configura sia Android (FCM) che iOS (APNs)

3
Copia le chiavi

Da Settings → Keys & IDs copia App ID e REST API Key

4
Configura in app

Inserisci App ID in app_config.json e REST Key nel modulo PS

Setup Android (FCM)

Per ricevere notifiche su Android:

1
Firebase Console

Crea un progetto su console.firebase.google.com

2
Server key

Vai in Impostazioni progetto → Cloud Messaging e copia la Server Key

3
Incolla in OneSignal

Nella configurazione Android di OneSignal incolla la Server Key

4
google-services.json

Scarica il file da Firebase e mettilo in android/app/google-services.json

Setup iOS (APNs)

1
Apple Developer

Crea un certificato APNs o chiave p8 in developer.apple.com

2
Configura in OneSignal

Carica il file .p8 e inserisci Key ID e Team ID nella configurazione iOS di OneSignal

3
Capability Xcode

In Xcode aggiungi Push Notifications e Background Modes → Remote notifications

Il piano gratuito di OneSignal supporta fino a 10.000 abbonati con notifiche illimitate. Sufficiente per la maggior parte dei negozi.

🏗️ Architettura app

ShopApp segue un'architettura a layer puliti con Riverpod come state manager.

Layer principali

LayerCartellaResponsabilità
Datacore/network/HTTP client, OAuth2, token refresh
Modelsmodels/Classi dati con fromJson()
Stateproviders/Riverpod StateNotifier/FutureProvider
UIscreens/ + widgets/ConsumerWidget con ref.watch()

Flusso di autenticazione

// 1. App avvia e carica token da storage sicuro
StorageService.instance.getCustomerToken()

// 2. Se il token è valido → Home Screen
// 3. Se manca il token → Login Screen

// 4. Login → modulo PS → genera HMAC token
POST /module/mobilenotifications/auth?action=login
{email, password}{customer, token}

// 5. Token salvato in FlutterSecureStorage
// 6. OneSignal externalUserId = "customer_{id}"

🔌 API Client

Admin API (OAuth2)

Usato per: catalogo prodotti, categorie. Token rinnovato automaticamente prima della scadenza.

// lib/core/network/api_client.dart
final resp = await ApiClient.instance.get(
  '/products',
  params: {'page': 1, 'itemsPerPage': 20},
);

Module Client

Usato per: login cliente, ordini, registrazione token. Invia automaticamente X-Customer-Token.

// Login cliente
final resp = await ModuleClient.instance.post(
  '/auth/login',
  {'email': email, 'password': password},
);

📱 Schermate

SchermataFileDescrizione
Splashsplash_screen.dartLogo animato, verifica token, redirect
Login / Registrazionelogin_screen.dartForm con gradient header, toggle login/register
Homehome_screen.dartBanner promozionale, categorie, prodotti in evidenza, novità
Catalogoproducts_screen.dartGrid con filtri categoria, ricerca, infinite scroll
Dettaglio prodottoproduct_detail_screen.dartGalleria immagini, quantità, CTA, badge sconto
Carrellocart_screen.dartLista con swipe-to-delete, riepilogo ordine
Ordiniorders_screen.dartTimeline animata, dettaglio, stato real-time
Profiloprofile_screen.dartInfo cliente, menu navigazione, logout
Shell (nav bar)main_shell.dartBottom navigation con badge carrello

🎨 Theming UI

Il tema viene costruito dinamicamente a partire dai colori in app_config.json usando Material Design 3.

// lib/core/theme/app_theme.dart
ThemeData buildTheme() {
  final primary = AppConfig.instance.primaryColor;
  final colorScheme = ColorScheme.fromSeed(
    seedColor: primary,
    secondary: AppConfig.instance.secondaryColor,
  );
  return ThemeData(useMaterial3: true, colorScheme: colorScheme);
}

Per cambiare il tema basta aggiornare primary_color e secondary_color nel JSON e ricompilare.

Font

L'app usa Poppins (Google Fonts) via pubspec.yaml. Per cambiare font: aggiungi i file TTF in assets/fonts/ e aggiorna pubspec.yaml.

🔗 Endpoint API modulo

Tutti gli endpoint sono accessibili via HTTPS su:

https://tuonegozio.it/module/mobilenotifications/{controller}?action={action}

Autenticazione

POST/auth?action=loginLogin cliente
Body: {"email":"...", "password":"..."}
Risposta: {"success":true, "customer":{"id":1, "firstname":"Mario", "token":"..."}}
POST/auth?action=registerRegistrazione
Body: {"firstname":"...", "lastname":"...", "email":"...", "password":"..."}
Risposta: {"success":true, "customer":{...}}

OneSignal Token

POST/fcm?action=registerRegistra player ID
Headers: X-Customer-Token: {token}
Body: {"player_id":"xxx", "device_type":"android"}

Ordini

GET/orders?action=listLista ordini cliente
Headers: X-Customer-Token: {token}
GET/orders?action=detail&id={orderId}Dettaglio ordine
Headers: X-Customer-Token: {token}
POST/orders?action=createCrea ordine
Headers: X-Customer-Token: {token}
Body: {"products":[{"id":1,"quantity":2}], "id_address_delivery":5, "payment":"bankwire"}
GET/orders?action=addressesIndirizzi cliente
Headers: X-Customer-Token: {token}

📤 Notifiche push

Automatiche (hook ordine)

Il modulo invia notifiche push automaticamente quando:

  • Un nuovo ordine viene creato (actionObjectOrderAddAfter)
  • Lo stato di un ordine cambia (actionOrderStatusUpdate)

Non serve nessuna configurazione aggiuntiva: funziona appena il modulo è installato e le chiavi OneSignal sono inserite.

Promozionali (da admin)

Dal pannello PrestaShop → Moduli → Mobile App Notifications:

  • Compila titolo e messaggio nella sezione "Invia notifica promozionale"
  • Clicca "Invia a tutti"
  • La notifica viene consegnata a tutti gli utenti con l'app installata

Payload notifica

// Struttura dati notifica OneSignal
{
  "type": "order_update",  // new_order | order_update | promo
  "order_id": "123",
  "reference": "ORD-2468"
}
🎯
Per personalizzare le notifiche per campagne avanzate (segmenti, A/B test, scheduling) usa direttamente la dashboard OneSignal.

🖥️ Pannello admin modulo

Accessibile da Moduli → Mobile App — White Label → Configura. Il pannello è diviso in 4 sezioni:

1 — Configurazione App White-Label

La sezione principale. Tutto ciò che il cliente imposta qui viene inviato all'app al prossimo avvio, senza rebuild.

CampoDescrizione
Nome AppNome del negozio mostrato nell'app e nelle notifiche push
TaglineBreve frase nella splash screen
Logo AppUpload immagine (jpg/png/webp, max 2MB). Consigliato: 512×512 su sfondo trasparente
Colore PrincipaleColor picker visivo + campo HEX. Controlla pulsanti, link, accenti
Colore SecondarioColor picker visivo. Controlla badge sconto e accenti secondari
ValutaSimbolo (€, $, £) e codice ISO (EUR, USD, GBP)
Prodotti per paginaQuanti prodotti caricare per ogni scroll del catalogo
Bundle IDSolo annotazione — promemoria per il developer
📡
Sotto il form è visibile l'URL endpoint configurazione che l'app chiama. Utile per debug: aprilo nel browser per vedere esattamente cosa riceve l'app.

2 — Configurazione OneSignal

OneSignal App ID e REST API Key per abilitare le notifiche push.

3 — Invia notifica promozionale

Invio diretto a tutti gli utenti con l'app installata. Titolo + messaggio liberi.

4 — Statistiche

Contatori in tempo reale: utenti con notifiche attive, notifiche inviate, notifiche fallite.

🆔 Bundle ID / Package Name

Il Bundle ID (iOS) e il Package Name (Android) sono l'identità unica della tua app nel mondo. Va scelto e impostato prima di qualsiasi altra operazione di deploy.

Cos'è e perché è critico

È una stringa in formato reverse-domain che identifica la tua app in modo univoco su tutti i sistemi. Non può essere cambiata dopo la pubblicazione senza perdere l'app sullo store. Viene usata da:

SistemaUtilizzo
Google PlayIdentificatore univoco dell'app. Due app con lo stesso Package Name non possono coesistere sul Play Store.
Apple App StoreCorrisponde esattamente all'App ID registrato su Apple Developer. Serve per firmare l'app e ricevere notifiche.
OneSignalDeve corrispondere al Bundle ID con cui è registrata l'app su OneSignal per ricevere notifiche push.
Firebase (FCM)Il file google-services.json è legato a un Package Name specifico.
Keystore AndroidIl keystore di firma è associato al Package Name dell'app.
🚨
Imposta il Bundle ID PRIMA di: creare il progetto Firebase, creare l'App ID su Apple Developer, configurare OneSignal e generare il keystore Android. Cambiarlo dopo comporta rifare tutto dall'inizio.

Un file solo — uno script solo

Non serve toccare AndroidManifest, build.gradle, Info.plist e project.pbxproj separatamente. Imposti due campi in app_config.json e lanci un unico comando:

# 1. Modifica assets/config/app_config.json
{
  "app_name":  "Fashion Store",
  "bundle_id": "com.fashionstore.app",
  ...
}

# 2. Lancia lo script — patcha i 4 file e scarica l'icona
dart run scripts/configure.dart

# Output
  → App name : Fashion Store
  → Bundle ID: com.fashionstore.app
  → Recupero logo da: https://fashionstore.it/.../config

  ✓ assets/images/launcher_icon.png (42 KB)

  ✓ android/app/src/main/AndroidManifest.xml → android:label
  ✓ android/app/build.gradle.kts → applicationId
  ✓ android/app/build.gradle.kts → namespace
  ✓ ios/Runner/Info.plist → CFBundleDisplayName
  ✓ ios/Runner/Info.plist → CFBundleName
  ✓ ios/Runner.xcodeproj/project.pbxproj → PRODUCT_BUNDLE_IDENTIFIER (3 occorrenze)

  ✅ Configurazione completata!

# 3. Genera tutte le risoluzioni icona da launcher_icon.png
dart run flutter_launcher_icons

Lo script si trova in scripts/configure.dart ed è già incluso nel progetto. Non ha dipendenze esterne — usa solo il Dart SDK già installato con Flutter.

💡
Differenza tra app_name e store_name: app_name è il nome che appare sotto l'icona sul telefono (impostato a build time dallo script). store_name è il nome mostrato dentro l'app (aggiornabile a runtime dal modulo PS). Spesso sono identici, ma potresti avere un nome launcher breve e un nome esteso in-app.

Come sceglierlo

La convenzione è com.nomeditta.nomenegozio. Usa solo lettere minuscole, numeri e punti. Esempi:

# Formato consigliato
com.acmesrl.fashionstore
it.miodominio.shopapp
com.clientenome.appnome
💡
Per ogni cliente usa un Bundle ID diverso: com.clientea.shop, com.clienteb.shop, ecc. In questo modo ogni app è completamente indipendente sugli store.

File patchati dallo script

FileCampo modificato
android/app/src/main/AndroidManifest.xmlandroid:label — nome app
android/app/build.gradle.ktsapplicationId e namespace (Kotlin DSL, Flutter ≥ 3.x)
ios/Runner/Info.plistCFBundleDisplayName e CFBundleName
ios/Runner.xcodeproj/project.pbxprojPRODUCT_BUNDLE_IDENTIFIER (tutte le configurazioni)
Non serve aprire Xcode o Android Studio per cambiare nome e bundle ID. Lo script funziona da terminale su macOS, Linux e Windows.

Ordine operativo corretto

1
Imposta app_name e bundle_id in app_config.json

Modifica i due campi in assets/config/app_config.json. È l'unico file che tocchi.

2
Lancia lo script di configurazione

dart run scripts/configure.dart — patcha automaticamente AndroidManifest, build.gradle, Info.plist e project.pbxproj.

3
Crea App ID su Apple Developer

Su developer.apple.com → Identifiers → nuovo App ID con lo stesso bundle_id. Abilita Push Notifications.

4
Crea progetto Firebase

Aggiungi l'app Android con il Package Name esatto. Scarica google-services.json e mettilo in android/app/.

5
Configura OneSignal

Crea una nuova app OneSignal con lo stesso Bundle ID. Inserisci credenziali FCM e APNs.

6
Genera il keystore Android

Solo adesso genera il keystore (vedi sezione Android).

7
Build e pubblica

flutter build appbundle --release per Android, flutter build ipa --release per iOS.

🤖 Build Android

Prerequisiti

  • Android Studio installato con SDK
  • File android/app/google-services.json da Firebase Console
  • Account Google Play Console (25$ una tantum)

Build APK debug (test)

flutter build apk --debug

Sequenza completa per un nuovo cliente

# 1. Configura nome, bundle ID, scarica icona
dart run scripts/configure.dart

# 2. Genera tutte le risoluzioni icona
dart run flutter_launcher_icons

# 3. Genera keystore (una volta sola per cliente)
keytool -genkey -v -keystore ~/nomeapp.jks \
  -keyalg RSA -keysize 2048 -validity 10000 \
  -alias nomeapp

# 4. Aggiungi in android/key.properties
storePassword=TUA_PASSWORD
keyPassword=TUA_PASSWORD
keyAlias=nomeapp
storeFile=/percorso/nomeapp.jks

# 5. Build finale
flutter build appbundle --release
🆔
Assicurati di aver già impostato il Package Name prima di generare il keystore. Consulta la sezione Bundle ID / Package Name per tutti i dettagli e l'ordine corretto delle operazioni.
📱
Il file AAB generato in build/app/outputs/bundle/release/app-release.aab è quello da caricare su Google Play Console.

🍎 Build iOS

⚠️
La build iOS richiede un Mac con Xcode installato e un account Apple Developer attivo (99$/anno).

Prerequisiti

  • macOS con Xcode ≥ 15.0
  • CocoaPods: sudo gem install cocoapods
  • Account Apple Developer con App ID registrato

Setup

# Installa pod
cd ios && pod install && cd ..

# Apri in Xcode
open ios/Runner.xcworkspace

In Xcode

🆔
Il Bundle Identifier deve essere già impostato prima di arrivare qui. Consulta la sezione Bundle ID / Package Name per come sceglierlo, dove cambiarlo e l'ordine corretto delle operazioni.
  • Verifica che il Bundle Identifier corrisponda a quello registrato su Apple Developer
  • Seleziona il tuo Team (Apple Developer)
  • Aggiungi capability Push Notifications
  • Aggiungi Background Modes → Remote Notifications

Sequenza completa per un nuovo cliente

# 1. Configura nome, bundle ID, scarica icona
dart run scripts/configure.dart

# 2. Genera tutte le risoluzioni icona
dart run flutter_launcher_icons

# 3. Installa pod e apri Xcode
cd ios && pod install && cd ..
open ios/Runner.xcworkspace

# 4. In Xcode: seleziona Team, verifica Bundle ID, aggiungi Push Notifications

# 5. Build finale
flutter build ipa --release

Da Xcode: Product → Archive e carica su App Store Connect.

🔄 Aggiungere un nuovo cliente

Checklist completa dal primo contatto alla pubblicazione sugli store.

1
Installa il modulo sul PS del cliente

Scarica mobilenotifications.zip da questa documentazione, caricalo in PS e installalo. Il cliente configura subito nome, logo e colori dal pannello admin.

2
Duplica il progetto Flutter

Copia la cartella mobile_app/ in una nuova directory dedicata al cliente.

3
Modifica app_config.json

Imposta i 6 campi: app_name, bundle_id, base_url, api_client_id, api_client_secret, onesignal_app_id.

4
Crea App ID Apple + Firebase + OneSignal

Usa lo stesso bundle_id su tutti e tre. Scarica google-services.json da Firebase → android/app/. Vedi sezione Bundle ID.

5
Lancia i 3 comandi di build
dart run scripts/configure.dart
dart run flutter_launcher_icons
flutter build appbundle --release  # Android
flutter build ipa --release         # iOS
6
Pubblica sugli store

Carica l'AAB su Google Play Console e l'IPA su App Store Connect tramite Xcode o Transporter.

Con il template pronto ogni nuovo cliente richiede circa 30 minuti di lavoro tecnico. Il cliente gestisce in autonomia il branding dal suo pannello PS.

📋 Config reference

app_config.json — campi build-time

Questi 6 campi si trovano in assets/config/app_config.json. Vengono letti una volta sola all'avvio dell'app e non vengono mai sovrascritti dal server. Modificarli richiede un rebuild e una nuova pubblicazione sugli store.

ChiaveTipoDescrizione
app_nameStringNome app usato da configure.dart per aggiornare AndroidManifest e Info.plist
bundle_idStringPackage name Android / Bundle ID iOS. Deve coincidere con Google Play, App Store, OneSignal e Firebase
base_urlStringURL base PrestaShop senza slash finale (es. https://negozio.it/prestashop)
api_client_idStringAdmin API Client ID — creato in PS → Configurazione avanzata → Admin API
api_client_secretStringAdmin API Client Secret — mostrato solo alla creazione, non recuperabile
onesignal_app_idStringOneSignal Application ID — trovato in OneSignal dashboard → Settings → Keys & IDs
🔒
Non condividere app_config.json in repository pubblici: contiene credenziali sensibili.

Modulo PrestaShop — campi runtime

Questi campi vengono gestiti dal pannello admin del modulo Mobile Notifications e restituiti dall'endpoint pubblico GET /module/mobilenotifications/config. L'app li legge ad ogni avvio: nessun rebuild necessario.

Chiave JSONTipoDefaultDescrizione
store_nameStringNome PS shopNome visualizzato nell'app
store_taglineString""Sottotitolo nella splash screen
logo_urlString|nullnullURL assoluto del logo caricato. Usato nella splash screen e da configure.dart per l'icona launcher
primary_colorString"#6C63FF"Colore principale HEX
secondary_colorString"#FF6584"Colore secondario HEX
currency_symbolString"€"Simbolo valuta visualizzato
currency_codeString"EUR"Codice ISO valuta (es. EUR, USD)
language_idNumber1ID lingua PrestaShop
products_per_pageNumber20Prodotti per pagina catalogo
show_ratingsBooleantrueMostra stelline sui prodotti
enable_wishlistBooleantrueAbilita la lista desideri

🔧 Troubleshooting

Errore 401 al login cliente

⚠️
Verifica che HTTPS sia attivo sul dominio. iOS blocca le connessioni HTTP senza ATS override. Controlla anche che i controller del modulo abbiano i permessi corretti (755).

Admin API restituisce 401

Le credenziali api_client_id / api_client_secret nel JSON non corrispondono a quelle in PrestaShop. Ricrea il client API e aggiorna il JSON.

Notifiche push non arrivano

  • Verifica che OneSignal App ID e REST Key siano corretti nel modulo PS
  • Controlla che il player ID sia stato registrato (vedi tabella mobile_tokens)
  • Su iOS verifica che Push Notification capability sia abilitata in Xcode
  • Testa l'invio direttamente dalla dashboard OneSignal

Immagini prodotti non caricate

Se le immagini non si vedono, verifica che l'URL costruito sia corretto. Il percorso delle immagini PS8 è: {base_url}/img/p/{n1}/{n2}/{id}.jpg dove le sottocartelle corrispondono alle cifre dell'ID immagine.

configure.dart: "File non trovato, saltato: android/..."

Le cartelle android/ e ios/ non contengono ancora i file di piattaforma. Succede solo se si parte da una copia del progetto con le directory vuote. Soluzione: rigenera i file con:

flutter create . --org com.tuaorg --project-name nome_progetto

Il comando preserva lib/, assets/ e pubspec.yaml. Poi rilancia dart run scripts/configure.dart.

Errore durante flutter pub get

# Pulisci e reinstalla
flutter clean
flutter pub get

❓ FAQ

Posso aggiungere un modulo di pagamento nell'app?

Sì, il modulo orders.php accetta il nome del modulo di pagamento nel campo payment. Puoi integrare Stripe, PayPal, o qualsiasi gateway PS estendendo il controller orders.php.

Come aggiorno l'app dopo modifiche al negozio?

Dipende da cosa cambi:

  • Prodotti, categorie, prezzi — l'app li vede in tempo reale, nessun aggiornamento necessario.
  • Nome negozio, logo, colori, valuta — si aggiornano dal pannello PS senza rebuild. L'app carica i nuovi valori al prossimo avvio.
  • Icona launcher — riesegui dart run scripts/configure.dart + dart run flutter_launcher_icons + rebuild + pubblica un nuovo aggiornamento sugli store.
  • Credenziali API / OneSignal / Bundle ID — modifica app_config.json, ricompila e pubblica un aggiornamento.

L'app supporta più lingue?

Attualmente la UI è in italiano. Puoi aggiungere l18n con il pacchetto flutter_localizations e definire le traduzioni in file ARB.

Come gestire la cache delle immagini?

L'app usa cached_network_image che gestisce automaticamente la cache locale. La durata di default è fino a 7 giorni. Modificabile via CacheManager custom.

Posso usare il codice per altri CMS oltre a PrestaShop?

Sì. L'architettura separa nettamente l'API layer dalla UI. Sostituendo api_client.dart e i modelli Product/Order puoi connettere qualsiasi backend REST.