The platform is the API.
Swift and Kotlin reach platform frameworks without a cross-platform adapter. That matters when background work, audio, camera, accessibility, app extensions, or OS-specific UI is the product. Direct does not mean automatic.
AI-First Mobile Engineering
Native is back. AI changed the cost curve. The platforms still get the last word. AI can accelerate Swift and Kotlin in parallel. It cannot turn iOS and Android into one product for free. Native wins when direct platform control is worth owning two real codebases.
Two codebases are not a failure of abstraction when platform behaviour is the feature.
Swift and Kotlin reach platform frameworks without a cross-platform adapter. That matters when background work, audio, camera, accessibility, app extensions, or OS-specific UI is the product. Direct does not mean automatic.
Native code reaches Core ML on Apple platforms and ML Kit, Gemini Nano, or LiteRT on Android directly. Cross-platform plugins can expose the same APIs. Native removes one compatibility layer when model support and device variation are already hard enough.
Instruments and Android Studio Profiler show platform threads, memory, network work, rendering, and energy without a framework layer in between. Fewer layers do not prevent bugs. They make ownership harder to dodge.
Current on-device AI entry points, checked 2 September 2026: Apple Core ML (opens in a new tab) and Android ML Kit, Gemini Nano, and LiteRT overview (opens in a new tab).
The AI-first prerequisite
AI can duplicate a feature quickly. It can duplicate a wrong assumption even faster. Keep the product contract and failure corpus shared while each platform owns its implementation.
Testing references: Apple testing in Xcode (opens in a new tab) and Android testing fundamentals (opens in a new tab).
Choose native when
Do not choose native when
Tools evolve. The jobs stay put: catch mistakes, prove behaviour, see reality, and harden the release on both platforms. These examples are current, not canonical.
Catch
Let the Swift compiler catch type failures. Add SwiftLint for the project rules the compiler does not own.
Let the Kotlin compiler catch type failures. Run Android Lint and detekt for platform and code-quality rules.
Prove
Use Swift Testing for unit and integration work, with XCTest UI tests for the journeys only the running app can prove.
Swift Testing + XCTest
Use JUnit and Robolectric for fast feedback, then instrumented Compose or View tests where Android behaviour matters.
JUnit + Robolectric + Android UI tests
See
Use the Xcode debugger and Instruments. Add Pulse or the HTTP Traffic instrument when request and streaming visibility shortens triage.
Instruments
Use the Android Studio debugger and Profiler. Add debug-only Chucker and LeakCanary when network or memory faults hide in normal logs.
Android Studio Profiler
Harden
Store session tokens in Keychain, verify App Attest signals on the server, strip release symbols, and treat string-literal obfuscation as friction, not secrecy.
Encrypt session tokens with an Android Keystore key before persisting them, verify Play Integrity signals on the server, and test R8 against release builds. Deeper hardening follows the threat model.
Provider keys do not belong in either binary. Obfuscation and hardening can raise extraction cost. They cannot turn a shipped secret or model into an unextractable asset.
Different stack. Same standard.
Tooling and security references: Apple performance and Instruments (opens in a new tab), Apple HTTP Traffic instrument (opens in a new tab), Android Studio profiling (opens in a new tab), App Attest (opens in a new tab), Play Integrity (opens in a new tab), and R8 app optimisation (opens in a new tab).
Daniel Melter brings recent hands-on native and Flutter development, backed by around ten years of traditional native work. Around three years with React Native apps, plus recent analysis of React Native app binaries with Claude Code, sharpen the view of where shared abstractions save time and where the platforms still collect their debt.
Native is not the premium answer by default. It is the honest answer when the hardest requirement already lives inside iOS or Android.
See why Flutter starts in pole position, read when React Native can beat it, or compare the complete decision at the mobile technology hub.