Journal

Kotlin Multiplatform on iOS: Share Logic, Keep Native UI

The KMP promise is share the brain, not the face: write your UI in SwiftUI so iOS feels native, and let Kotlin handle the logic underneath.

Kotlin Multiplatform on iOS: Share Logic, Keep Native UI: a glass iPhone app-grid icon on a mint and teal gradient

TL;DR

Kotlin Multiplatform (KMP) lets you share business logic across iOS and Android, but the right approach on iOS is to keep the UI native: build SwiftUI screens and navigation that call into the shared Kotlin code. Build the native navigation from a free VP0 design, follow iOS conventions (stacks, tabs, swipe-back), and call shared KMP logic underneath. Do not share the UI layer; that is what makes iOS feel like iOS.

Kotlin Multiplatform’s real promise is sharing the brain, not the face: write your business logic once in Kotlin, and build the UI natively on each platform. The short answer: on iOS, build native SwiftUI screens and navigation from a free VP0 design that call into your shared Kotlin code, following iOS conventions (navigation stacks, tab bars, swipe-back), rather than sharing the UI. That is what makes an iOS app feel like iOS. Teams adopt KMP because it lets them share a large share of code, often more than 50%, while keeping platform-native interfaces.

Share the logic, keep the navigation native

The temptation is to share UI too, but that is where cross-platform apps start feeling foreign. iOS users expect specific behavior: a navigation stack that pushes and pops with the swipe-back gesture, native tab bars, sheets and large titles, and platform animations. So build that navigation in SwiftUI, honoring the conventions, and have your screens call the shared Kotlin logic (networking, business rules, data) underneath. The shared layer does not know or care about the UI; it just provides the logic. The result is a genuinely native iOS feel with most of the code reused. The Kotlin Multiplatform docs describe this share-logic-not-UI approach.

Build it from a free design

VP0 is a free iOS design library for AI builders. Pick navigation, list, and detail designs, copy their links, and have Cursor or Claude Code rebuild them in SwiftUI, using NavigationStack and TabView so you inherit correct iOS behavior, then wire each screen to call your shared KMP module. Keep the boundary clean: SwiftUI for everything the user sees and touches, Kotlin for the logic behind it. Do not try to render a shared UI on iOS, it breaks the conventions users expect. Test the swipe-back gesture, deep links, and state restoration. Done well, the user never senses that any code is shared with another platform at all. Use your own brand. For the Android-flavored equivalent, see Compose Multiplatform iOS UI look and feel, and for the AI build loop, see how to build an iOS app with AI.

KMP-on-iOS building blocks

Native UI over shared logic.

LayerBuild it inWhy
NavigationSwiftUI (NavigationStack, TabView)Native conventions and gestures
ScreensSwiftUILook and feel like iOS
Business logicShared Kotlin (KMP)Write once, reuse
Networking and dataShared KotlinConsistent across platforms
Platform featuresNative (Swift)Camera, notifications, etc.

Common mistakes

The first mistake is sharing the UI layer, which makes iOS feel foreign and breaks conventions. The second is ignoring the swipe-back gesture and native navigation behavior. The third is leaking platform assumptions into the shared logic. The fourth is a messy boundary between SwiftUI and Kotlin. The fifth is treating KMP like a write-the-whole-app-once tool, when its strength is sharing logic. Keep the UI native and the logic shared.

A worked example

Say you build a cross-platform app with KMP. On iOS, from VP0 designs, you build SwiftUI navigation with NavigationStack and a TabView, so push, pop, swipe-back, and tabs all behave natively. Each screen calls your shared Kotlin module for networking and business rules. The user gets a fully native iOS experience, with the swipe-back gesture and platform animations intact, while most of the logic is reused with Android. Your brand is your own. For a trendy layout style next, see bento box UI mobile app inspiration, and for an AI app builder, see Rork UI library.

Key takeaways

  • KMP shares business logic across platforms; keep the UI native on iOS.
  • Build SwiftUI navigation from a free VP0 design and call shared Kotlin underneath.
  • Follow iOS conventions: NavigationStack, TabView, swipe-back, sheets.
  • Keep a clean boundary, SwiftUI for the UI, Kotlin for the logic.
  • Do not share the UI layer; that is what makes iOS feel native.

Frequently asked questions

How do I use Kotlin Multiplatform on iOS? Share business logic in a Kotlin module, but build the UI natively: SwiftUI screens and navigation (NavigationStack, TabView) from a free VP0 design that call into the shared Kotlin code.

Should I share the UI with KMP? No. Sharing UI tends to break iOS conventions and feel foreign. Share the logic and build native SwiftUI on iOS so the app feels like iOS, with the swipe-back gesture and native behavior.

What should the shared Kotlin layer contain? Business logic, networking, data models, and rules, anything platform-agnostic. Keep platform-specific UI and features (camera, notifications) in the native layer.

Is it okay to learn from KMP example apps? Yes. Learn the share-logic-keep-UI-native pattern, but build your own SwiftUI navigation and brand. The pattern, not a specific app’s code, is what matters.

Frequently asked questions

How do I use Kotlin Multiplatform on iOS?

Share business logic in a Kotlin module, but build the UI natively: SwiftUI screens and navigation (NavigationStack, TabView) from a free VP0 design that call into the shared Kotlin code.

Should I share the UI with KMP?

No. Sharing UI tends to break iOS conventions and feel foreign. Share the logic and build native SwiftUI on iOS so the app feels like iOS, with the swipe-back gesture and native behavior.

What should the shared Kotlin layer contain?

Business logic, networking, data models, and rules, anything platform-agnostic. Keep platform-specific UI and features (camera, notifications) in the native layer.

Is it okay to learn from KMP example apps?

Yes. Learn the share-logic-keep-UI-native pattern, but build your own SwiftUI navigation and brand. The pattern, not a specific app's code, is what matters.

Part of the AI App Builders & Vibe Coding Tools hub. Browse all VP0 topics →

Keep reading

Capacitor Custom Native Header UI on iOS (Free Guide): the App Store logo as a glossy glass icon on a purple and blue gradient with floating bubbles
Guides 4 min read

Capacitor Custom Native Header UI on iOS (Free Guide)

A Capacitor app's web origin shows in the header. Make it native: respect the safe area, use iOS nav-bar conventions, and reference a free VP0 iOS design.

Lawrence Arya · May 30, 2026
Compose Multiplatform: iOS Look and Feel (Done Right): a glossy App Store icon on a blue, pink and orange gradient with bubbles
Guides 4 min read

Compose Multiplatform: iOS Look and Feel (Done Right)

Compose Multiplatform shares Kotlin UI but renders its own, so iOS feel is opt-in. Target Apple's HIG, not Material defaults; reference a free VP0 design.

Lawrence Arya · May 30, 2026
Expo Router v3 Boilerplates With UI (Take the Routing): a phone toggle icon surrounded by location, calendar, settings, wallet and chart app icons on a coral gradient
Guides 4 min read

Expo Router v3 Boilerplates With UI (Take the Routing)

Expo Router gives file-based navigation. Take a boilerplate's routing skeleton, replace its placeholder screens, and build your own from a free VP0 design.

Lawrence Arya · May 30, 2026
Flutter iOS Cupertino Widgets: Native-Feeling UI: a glossy App Store icon on a blue, pink and orange gradient with bubbles
Guides 4 min read

Flutter iOS Cupertino Widgets: Native-Feeling UI

Flutter's Cupertino widgets get an app close to iOS-native, but coverage is uneven. Target Apple's HIG, fill the gaps, and use a free VP0 design as your reference.

Lawrence Arya · May 30, 2026
iPadOS Split View App Template in SwiftUI (Free): a glass iPhone app-grid icon on a mint and teal gradient
Guides 4 min read

iPadOS Split View App Template in SwiftUI (Free)

An iPad app shouldn't be a stretched iPhone layout. Use SwiftUI NavigationSplitView for a sidebar-list-detail layout, with each column built from a free VP0 screen.

Lawrence Arya · May 30, 2026
Free SwiftUI Templates (and How to Build From Them): the App Store logo as a glossy glass icon on a purple and blue gradient with floating bubbles
Guides 4 min read

Free SwiftUI Templates (and How to Build From Them)

Free SwiftUI templates are useful only if they're native, yours to edit, and lead to code. Turn free VP0 designs into SwiftUI you own with Cursor or Claude Code.

Lawrence Arya · May 30, 2026