mymuseum-visitapp/README.md

187 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.