iOS in Swift, Android in Kotlin — the platform's own languages, frameworks, and design systems. Maximum performance, deepest device access, and the closest match to the user's expectations.
← Back to Client Side| — | iOS | Android |
|---|---|---|
| Language | Swift | Kotlin |
| Modern UI | SwiftUI (2019) | Jetpack Compose (2021) |
| Legacy UI | UIKit | Android Views (XML) |
| IDE | Xcode (macOS only) | Android Studio (Win/Mac/Linux) |
| Package manager | SwiftPM, CocoaPods | Gradle + Maven |
| Store | App Store (curated) | Play Store + sideloading |
| Device fragmentation | Low — Apple controls hardware | High — thousands of OEM models |
| OS-version fragmentation | Most users on latest 1–2 | Long tail; minSdk choice matters |
| Distribution outside store | Enterprise / TestFlight only | APK sideload, alternative stores |
onCreate, onResume, onPause, onDestroy). The OS may kill processes anytime under memory pressure.Both frameworks adopted the React-style "UI as a function of state" model. You describe what the UI is, not how to mutate it. State changes trigger a recomposition; the framework diffs and updates only what changed.
@State, @Binding, @Observable, @Environment.remember, mutableStateOf, collectAsState, CompositionLocal.async/await, structured concurrency, actor for isolation. Strict mode is the default in Swift 6.viewModelScope, lifecycleScope), Flow for streams.Camera-heavy apps, AR, audio production, games, anything 60fps+ scrolling huge data.
Widgets, Live Activities, App Intents (iOS); App Widgets, foreground services (Android). Cross-platform layers always trail.
If you're shipping iOS-only or Android-only first, native costs less than the cross-platform overhead.
Native gets first-class support for new OS features for as long as the platform exists.