# README # This README would normally document whatever steps are necessary to get your application up and running. ### What is this repository for? ### * Quick summary * Version * [Learn Markdown](https://bitbucket.org/tutorials/markdowndemo) ### How do I get set up? ### * Summary of set up * Configuration * Dependencies * Database configuration * How to run tests * Deployment instructions ### Contribution guidelines ### * Writing tests * Code review * Other guidelines ### Who do I talk to? ### * Repo owner or admin * Other community or team contact # OPENAPI Generation cmd flutter clean flutter pub get flutter pub run build_runner build --delete-conflicting-outputs Le fichier est dans le projet. # Assets Les svg de drapeaux viennent de là https://flagicons.lipis.dev/ # Publication sur le Google PlayStore Les paramètres de signing sont les mêmes que pour l'application tablet (donc la même android key). Puis : flutter build appbundle Faut pas oublier d'aller changer la version avant chaque upload de version (Puis mettre l'app bundle dans le dossier du PC, peut-être mettre sur le repos aussi ?) # Clients existants | Flavor | Package Android | Bundle iOS | Instance ID | Nom app | |---|---|---|---|---| | `mdlf` | `be.unov.mymuseum.mdlf` | `be.unov.mymuseum.mdlf` | `65ccc67265373befd15be511` | MDLF | | `fortsaintheribert` | `be.unov.mymuseum.fortsaintheribert` | `be.unov.mymuseum.fortsaintheribert` | `633ee379d9405f32f166f047` | Fort Saint-Héribert | | `dev` | `be.unov.myinfomate.test` | `be.unov.myinfomate.test` | `63514fd67ed8c735aaa4b8f2` | MyMuseum Dev | # Builder pour un client Les paramètres à passer à chaque build : - `FLAVOR` — nom du flavor (`dev`, `mdlf`, `fortsaintheribert`, ...) - `INSTANCE_ID` — le GUID de l'instance dans le backend - `API_BASE_URL` — l'URL de l'API backend - `API_KEY` — la clé API de l'instance (générée via le Manager, endpoint `/api/apikey`) > La clé API est embarquée dans le binaire au moment du build. Elle est récupérable dans le Manager. ## Android (App Bundle pour Play Store) ``` flutter build appbundle --flavor mdlf --release -t lib/main.dart \ --dart-define=FLAVOR=mdlf \ --dart-define=INSTANCE_ID=65ccc67265373befd15be511 \ --dart-define=API_BASE_URL=https://api.mymuseum.be \ --dart-define=API_KEY=CLE_API_MDLF flutter build appbundle --flavor fortsaintheribert --release -t lib/main.dart \ --dart-define=FLAVOR=fortsaintheribert \ --dart-define=INSTANCE_ID=633ee379d9405f32f166f047 \ --dart-define=API_BASE_URL=https://api.mymuseum.be \ --dart-define=API_KEY=CLE_API_FORTSAINTHERIBERT ``` ## iOS (fichier .ipa pour App Store) > IPA = format de fichier d'une app iOS, équivalent de l'App Bundle Android. C'est ce qu'on upload sur l'App Store Connect. ``` flutter build ipa --flavor mdlf --release -t lib/main.dart \ --dart-define=FLAVOR=mdlf \ --dart-define=INSTANCE_ID=65ccc67265373befd15be511 \ --dart-define=API_BASE_URL=https://api.mymuseum.be \ --dart-define=API_KEY=CLE_API_MDLF flutter build ipa --flavor fortsaintheribert --release -t lib/main.dart \ --dart-define=FLAVOR=fortsaintheribert \ --dart-define=INSTANCE_ID=633ee379d9405f32f166f047 \ --dart-define=API_BASE_URL=https://api.mymuseum.be \ --dart-define=API_KEY=CLE_API_FORTSAINTHERIBERT ``` ## Dev local (flavor dev) ``` flutter run --flavor dev -t lib/main.dart \ --dart-define=FLAVOR=dev \ --dart-define=INSTANCE_ID=63514fd67ed8c735aaa4b8f2 \ --dart-define=API_BASE_URL=http://192.168.x.x:5000 \ --dart-define=API_KEY=CLE_API_DEV ``` ## Icône de l'app Pour mettre une icône spécifique par client, utilise https://easyappicon.com/ pour générer les assets, puis place-les dans `android/app/src/{flavor}/res/mipmap-*/ic_launcher.png` (ils remplaceront automatiquement l'icône par défaut au build). # Ajouter un nouveau client Exemple avec un client nommé `newclient` → package `be.unov.myinfomate.newclient` **1. Firebase Console** → projet `mymuseum-3b97f` - Ajouter app Android (`be.unov.myinfomate.newclient`) → re-télécharger `google-services.json` → le copier dans `android/app/src/newclient/google-services.json` (et mettre à jour les autres flavors aussi) - Ajouter app iOS (`be.unov.myinfomate.newclient`) → télécharger `GoogleService-Info.plist` → sauvegarder dans `ios/config/newclient/GoogleService-Info.plist` - Uploader l'APNs Auth Key dans Firebase pour la nouvelle app iOS (même clé que les autres apps) **2. Apple Developer Portal** - Créer App ID `be.unov.myinfomate.newclient` avec Push Notifications activé **3. `android/app/build.gradle`** : ajouter le flavor dans `productFlavors` ```groovy newclient { dimension "client" applicationId "be.unov.myinfomate.newclient" resValue "string", "app_name", "Nom de l'app" } ``` **4. Xcode** : dupliquer les 3 configs (`Debug`, `Release`, `Profile`) pour le nouveau flavor, créer le scheme partagé - Build Settings → `PRODUCT_BUNDLE_IDENTIFIER` = `be.unov.myinfomate.newclient` - Build Settings → ajouter `FLUTTER_FLAVOR` = `newclient` **5. Mettre à jour le tableau "Clients existants"** en haut de ce README avec le nouveau client **6. Ajouter les couleurs dans `lib/constants.dart`** Ajouter un nouveau cas dans chaque ternaire (`kMainColor0`, `kMainColor1`, `kMainColor2`) : ```dart _flavor == 'newclient' ? 0xFFxxxxxx : // couleur principale du client ``` **7. Ajouter les assets splash et loader** - `assets/splash/newclient.png` — logo affiché au démarrage de l'app (fond transparent, ~400×400px) - `assets/loader/newclient.png` — icône du loader in-app, affiché en rotation pendant les chargements (fond transparent, ~200×200px) Puis ajouter le nouveau flavor dans les deux constantes de `lib/constants.dart` : ```dart const kSplashLogoAsset = _flavor == 'mdlf' ? 'assets/splash/mdlf.png' : _flavor == 'fortsaintheribert' ? 'assets/splash/fortsaintheribert.png' : _flavor == 'newclient' ? 'assets/splash/newclient.png' : 'assets/splash/dev.png'; const kLoaderAsset = _flavor == 'mdlf' ? 'assets/loader/mdlf.png' : _flavor == 'fortsaintheribert' ? 'assets/loader/fortsaintheribert.png' : _flavor == 'newclient' ? 'assets/loader/newclient.png' : 'assets/loader/dev.png'; ``` > Si tu ne fournis pas d'image, le fallback est automatique : `Icons.museum_outlined` pour le loader, `Icons.museum_outlined` pour le splash. Mais l'image doit quand même exister dans `assets/` (même un placeholder 1×1px) car Flutter vérifie les assets déclarés au build. **8. Tester** ``` flutter run --flavor newclient -t lib/main.dart \ --dart-define=FLAVOR=newclient \ --dart-define=INSTANCE_ID=GUID_DU_CLIENT \ --dart-define=API_BASE_URL=https://api.mymuseum.be ``` > ⚠️ Les fichiers `ios/config/*/GoogleService-Info.plist` marqués PLACEHOLDER doivent être remplacés par les vrais fichiers téléchargés depuis Firebase Console avant de builder en production iOS.