2.3 KiB
2.3 KiB
Shared Module
KMP umbrella module that exports all core and feature modules as a single Shared.framework for iOS. On Android, this module is a dependency of :app but the framework export is iOS-only.
Framework Export
shared/build.gradle.kts configures iOS targets (iosArm64, iosSimulatorArm64) and exports:
core:common,core:model,core:network,core:data— exported viaapi()so iOS sees all public typescore:ui+ allfeature:*modules — included viaimplementation()for Compose Multiplatform screen sharing
The framework is static (isStatic = true) and named Shared.
iOS Platform Files (src/iosMain/)
| File | Purpose |
|---|---|
IosKoinHelper.kt |
startIosKoin() — called from Swift iOSApp.init(). Sets up Kermit logging via NSLog, installs crash reporting, starts Koin with iOS modules. |
IosSharedModule.kt |
Koin module wiring Darwin Ktor engine, three HttpClient instances (main, streaming, refresh), all 16 API services, SSE client, and LibreChatSDK. |
IosKoinAccessor.kt |
Swift-accessible Koin resolver. KoinHelper.swift calls these to get SDK, repos, etc. |
IosCrashReporting.kt |
Unhandled exception hook — logs via Kermit + raises NSException for readable iOS crash logs. |
MainViewController.kt |
MainViewController() — the Compose Multiplatform entry point wrapped by ComposeView.swift. |
Common Files (src/commonMain/)
LibreChatSDK.kt— Facade class aggregating all API services, token manager, and SSE clientnavigation/— Nav 3 route definitions and entry providers shared across platformsapp/— Shared app-level composables (root navigation host)
SKIE
The SKIE Gradle plugin is applied here. All features are enabled by default:
- Sealed classes → Swift exhaustive enums (
onEnum(of:)) Flow<T>→AsyncSequencesuspend fun→async throws
No explicit SKIE configuration is needed unless disabling a specific feature.
Adding Platform-Specific Code
- iOS implementations go in
src/iosMain/withactualdeclarations matchingexpectincommonMain - For feature-level platform code, prefer adding
iosMainsource sets in the feature module itself rather than here - This module should only contain app-level iOS wiring (DI bootstrap, framework entry point)