💻 Développement

dev-mobile-sdk-architect

Architecture SDK mobile fintech (Kotlin Multiplatform). Conception modules, APIs, couches, design patterns, sécurité, performance.

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- dev-mobile-sdk-architect --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } dev-mobile-sdk-architect -Launch"

🚀 Déjà installé ?

claude "/dev-mobile-sdk-architect"

Ou tapez /dev-mobile-sdk-architect dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

architectureSDKmultiplatformmobile backendmoduleKMPSDK fintech

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/skills/dev-mobile-sdk-architect ~/.claude/skills/

Payload du plugin : skills/dev-mobile-sdk-architect · source éditable : dev-skills/mobile-sdk-architect

📖 Manuel

Mobile SDK Architect (Fintech Kotlin)

Workflow en étapes

1. Analyse des besoins et périmètre

Critère de décision — KMP vs natif vs bridge :

ContexteChoix
Équipe Kotlin existante, logique métier à partagerKMP (shared commonMain)
App mobile unique, Android onlyModule Gradle natif
App Flutter/RN existanteBridge natif (FFI ou JNI/Obj-C)
Time-to-market prioritaireReact Native SDK

2. Structure modulaire Gradle / KMP

sdk/
├── core/            # entités, use cases, interfaces (pas d'Android)
├── network/         # Retrofit/Ktor, Serialization
├── storage/         # Room / SQLDelight (KMP)
├── auth/            # OAuth2, JWT, token refresh
├── payments/        # logique paiement, state machine
└── sample-app/      # démo intégration

Déclaration multiplatform (build.gradle.kts) :

kotlin {
    androidTarget()
    iosX64(); iosArm64(); iosSimulatorArm64()

    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-core:2.3.12")
                implementation("app.cash.sqldelight:runtime:2.0.2")
            }
        }
        val androidMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-okhttp:2.3.12")
            }
        }
        val iosMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-darwin:2.3.12")
            }
        }
    }
}

3. API publique — design et rétrocompatibilité

// facade publique
class FintechSDK private constructor(private val config: SDKConfig) {
    companion object {
        fun init(config: SDKConfig): FintechSDK = FintechSDK(config)
    }
    val payments: PaymentsApi get() = PaymentsApiImpl(...)
    val kyc: KycApi get() = KycApiImpl(...)
}

// jamais exposer :
internal class PaymentsApiImpl(...) : PaymentsApi { ... }

4. Sécurité et conformité (fintech 2026)

// Certificate pinning OkHttp
val client = OkHttpClient.Builder()
    .certificatePinner(
        CertificatePinner.Builder()
            .add("api.myfintech.com", "sha256/AAAA...==")
            .build()
    )
    .connectTimeout(10, TimeUnit.SECONDS)
    .readTimeout(30, TimeUnit.SECONDS)
    .build()

5. Error handling standardisé

Sealed class pour erreurs métier, jamais de try/catch silencieux :

sealed class SdkResult<out T> {
    data class Success<T>(val data: T) : SdkResult<T>()
    sealed class Failure : SdkResult<Nothing>() {
        data class Network(val code: Int, val msg: String) : Failure()
        data class Business(val errorCode: String, val msg: String) : Failure()
        data class Unexpected(val cause: Throwable) : Failure()
    }
}

// codes métier exhaustifs
object ErrorCodes {
    const val KYC_FAILED       = "ERR_KYC_001"
    const val AUTH_EXPIRED     = "ERR_AUTH_002"
    const val INSUFFICIENT_BALANCE = "ERR_PAY_003"
}

6. Performance mobile

// WorkManager sync périodique
val syncRequest = PeriodicWorkRequestBuilder<TransactionSyncWorker>(
    repeatInterval = 15, TimeUnit.MINUTES
).setConstraints(
    Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build()
).build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
    "tx_sync", ExistingPeriodicWorkPolicy.KEEP, syncRequest
)

7. Testing

CoucheOutilCible
Domain (use cases, entities)JUnit5 + MockK> 90 %
Data (Retrofit, Room)Hilt test + Robolectric> 75 %
UI / ComposeCompose Testing + Espressosmoke tests
Contrat APIWireMock / MockWebServerrégression
PerformanceAndroid Profiler + Benchmarkbaseline
// MockK use case test
@Test
fun `transfer fails on insufficient balance`() = runTest {
    coEvery { repository.getBalance(any()) } returns 10.0
    val result = transferUseCase(TransferRequest(amount = 500.0, ...))
    assertIs<SdkResult.Failure.Business>(result)
    assertEquals(ErrorCodes.INSUFFICIENT_BALANCE, result.errorCode)
}

8. Documentation et publication

// publishing block (build.gradle.kts)
publishing {
    publications {
        create<MavenPublication>("release") {
            groupId = "com.mycompany"
            artifactId = "fintech-sdk"
            version = "2.1.0"
            from(components["release"])
        }
    }
}

Garde-fous / Anti-patterns

Anti-patternConséquenceCorrection
Exposer des classes internes dans l'API publiqueBreaking changes incontrôlésinternal + façade
Crasher au lieu de retourner une erreur métierApp cliente planteSdkResult.Failure systématique
Bloquer le main thread (réseau, DB)ANRCoroutines + Dispatchers.IO
Stocker tokens en SharedPreferences non chiffréesVol de sessionEncryptedSharedPreferences / Keystore
Pagination offset sur > 10 000 lignesTimeouts, duplicatsCursor-based (after=<id>)
Logger PAN/IBAN en clairNon-conformité PCI-DSSSensitiveDataFilter obligatoire
Init SDK bloquant au démarrageTemps de lancement > 500 msLazy init + coroutine scope
Semver ignoré (breaking en MINOR)Intégrations cassées en prodRevue API diff avant release

Bonnes pratiques 2026