Flocon/FloconAndroid/sample-multiplatform/README.md
Florent CHAMPIGNY 83fa902f63
refact: [CORE] transform project into kotlin multiplatform (#370)
Co-authored-by: Florent Champigny <florent@bere.al>
2025-10-22 13:02:35 +02:00

151 lines
3.9 KiB
Markdown

# App-Multi - Module Kotlin Multiplatform
Ce module est une version multiplateforme de `app` utilisant Kotlin Multiplatform avec Compose Multiplatform.
## Plateformes supportées
- **Android** - Application Android native
- **Desktop (JVM)** - Application Desktop (macOS, Windows, Linux)
- **iOS** - Support iOS (iosX64, iosArm64, iosSimulatorArm64)
## Architecture
### Structure des sources
```
app-multi/
├── src/
│ ├── commonMain/ # Code partagé entre toutes les plateformes
│ │ └── kotlin/
│ │ ├── ui/ # UI Compose Multiplatform
│ │ └── ... # Logique métier partagée
│ ├── androidMain/ # Code spécifique Android
│ │ └── kotlin/
│ │ └── MainActivity.kt
│ ├── desktopMain/ # Code spécifique Desktop/JVM
│ │ └── kotlin/
│ │ └── Main.kt
│ └── iosMain/ # Code spécifique iOS
```
### Technologies utilisées
- **Kotlin Multiplatform** - Partage de code entre plateformes
- **Compose Multiplatform** - UI déclarative multiplateforme
- **Ktor** - Client HTTP (remplace OkHttp)
- **Room** - Base de données locale (Android uniquement)
- **Flocon** - Intercepteurs et outils de développement
## Changements par rapport au module `app`
**Ajouts:**
- Support Kotlin Multiplatform (Android, JVM, iOS)
- Compose Multiplatform pour UI partagée
- Ktor client avec support multiplateforme
**Retraits:**
- GraphQL (Apollo)
- gRPC
- OkHttp (remplacé par Ktor)
## Lancement des applications
### Android
```bash
# Debug build
./gradlew :app-multi:assembleDebug
# Installer sur appareil/émulateur
./gradlew :app-multi:installDebug
# Lancer depuis IDE
# Ouvrir dans Android Studio et exécuter MainActivity
```
### Desktop (JVM)
```bash
# Exécuter l'application Desktop (depuis le code source)
./gradlew :app-multi:run
# Ou utiliser la tâche spécifique Desktop
./gradlew :app-multi:desktopRun
# Exécuter depuis la distribution packagée
./gradlew :app-multi:runDistributable
# Créer la distribution pour la plateforme actuelle
./gradlew :app-multi:createDistributable
# Créer les packages natifs (DMG, MSI, DEB selon votre OS)
./gradlew :app-multi:packageDistributionForCurrentOS
```
Les distributions packagées seront dans `app-multi/build/compose/binaries/main/`:
- `.dmg` pour macOS
- `.msi` pour Windows
- `.deb` pour Linux
### iOS
```bash
# Compiler pour iOS
./gradlew :app-multi:iosX64MainKlibrary
# Pour exécuter, ouvrir dans Xcode ou utiliser Kotlin Multiplatform plugin
```
## Structure de l'application
L'interface utilisateur est définie dans `commonMain/ui/App.kt` et est utilisée par:
- **Android**: Via `MainActivity.kt` qui initialise le contexte Android
- **Desktop**: Via `Main.kt` qui crée une fenêtre Compose Desktop
- **iOS**: Via le bridge iOS (à configurer)
## Client HTTP Ktor
Le client HTTP est initialisé différemment selon la plateforme:
- **Android**: `OkHttp` engine
- **Desktop**: `CIO` engine
- **iOS**: `CIO` engine
```kotlin
// Exemple d'utilisation
DummyHttpKtorCaller.callGet() // GET request
DummyHttpKtorCaller.callPost() // POST request
```
## Développement
### Ajouter du code partagé
Placer le code dans `commonMain/kotlin/`. Il sera disponible sur toutes les plateformes.
### Ajouter du code spécifique à une plateforme
- Android: `androidMain/kotlin/`
- Desktop: `desktopMain/kotlin/`
- iOS: `iosMain/kotlin/`
### Expect/Actual
Pour les fonctionnalités spécifiques à une plateforme, utiliser le mécanisme `expect`/`actual`:
```kotlin
// commonMain
expect fun getPlatformName(): String
// androidMain
actual fun getPlatformName() = "Android"
// desktopMain
actual fun getPlatformName() = "Desktop"
```
## Notes
- Room Database n'est disponible que sur Android
- SharedPreferences n'est disponible que sur Android
- L'UI Compose est 100% partagée entre Android et Desktop