187 lines
6.9 KiB
Markdown
187 lines
6.9 KiB
Markdown
# 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.
|