Kotlin Academy · Lesson

Platform APIs

Access native features.

Lesson 4 of 413 steps

Platform APIs is a free Kotlin Academy lesson on CoddyKit. This is lesson 4 of 4. Any 3 lessons of this learning path are free to read in full — after that, CoddyKit PRO unlocks every lesson, plus hands-on practice with a built-in code editor and a 24/7 AI tutor. It is part of the Kotlin Academy learning path, and your progress syncs across the web and the CoddyKit app. The Kotlin Academy course includes 4 lessons in total.

Accessing Native Features

Shared code sometimes needs device features — storage, settings, the clock, networking engine. KMM offers several ways to reach native APIs cleanly.

expect/actual for Primitives

For small platform values, use expect/actual. Common code stays clean while each platform fills in the detail.

// commonMain
expect fun currentTimeMillis(): Long

// androidMain
actual fun currentTimeMillis(): Long = System.currentTimeMillis()

Dependency Injection of Platform Code

A more flexible approach: define an interface in common code and inject a platform implementation from each app.

// commonMain
interface Storage {
    fun save(key: String, value: String)
    fun load(key: String): String?
}

Android Implementation

Android implements the interface with SharedPreferences and provides it to shared code.

// androidMain
import android.content.SharedPreferences

class AndroidStorage(private val prefs: SharedPreferences) : Storage {
    override fun save(key: String, value: String) {
        prefs.edit().putString(key, value).apply()
    }
    override fun load(key: String): String? = prefs.getString(key, null)
}

iOS Implementation

iOS implements the same interface with NSUserDefaults from the Foundation framework.

// iosMain
import platform.Foundation.NSUserDefaults

class IosStorage : Storage {
    private val defaults = NSUserDefaults.standardUserDefaults
    override fun save(key: String, value: String) = defaults.setObject(value, key)
    override fun load(key: String): String? = defaults.stringForKey(key)
}

Calling Native iOS APIs

From iosMain you can call Apple frameworks directly because Kotlin/Native generates interop bindings for them.

import platform.UIKit.UIDevice

fun deviceModel(): String = UIDevice.currentDevice.model

Calling Android APIs

androidMain has the full Android SDK available, since it compiles against the Android platform.

import android.os.Build

fun deviceModel(): String = Build.MODEL

Ready-Made Multiplatform Libraries

Often you don't need custom interop. Libraries already wrap common features:

  • multiplatform-settings — key-value storage
  • Ktor — networking
  • SQLDelight — local database

Providing Implementations

Inject platform implementations at app startup, typically via a DI framework like Koin, so shared code receives the right one.

// Android: provide AndroidStorage(prefs)
// iOS: provide IosStorage()
// Shared Repository(storage) uses whichever was injected

Choosing an Approach

Guidelines:

  • Tiny value → expect/actual
  • Behavior with multiple methods → interface + injection
  • Common need → use an existing multiplatform library

A Runnable Abstraction Demo

The interface idea is plain Kotlin. Here an in-memory implementation stands in for a platform store.

interface Storage {
    fun save(key: String, value: String)
    fun load(key: String): String?
}

class MemoryStorage : Storage {
    private val map = mutableMapOf<String, String>()
    override fun save(key: String, value: String) { map[key] = value }
    override fun load(key: String): String? = map[key]
}

fun main() {
    val s: Storage = MemoryStorage()
    s.save("name", "Ada")
    println(s.load("name"))
}

Quick Check

You need a storage feature with several methods, implemented differently on each platform and easily testable. What is the recommended approach?

Recap

You can reach native features cleanly:

  • expect/actual for primitives
  • Common interface + injected platform implementation for behavior
  • Direct interop in androidMain/iosMain
  • Reuse multiplatform libraries when possible

That completes the KMM Basics course.

Free to start

Learn Kotlin with an AI tutor — free

Write and run real code in your browser, get instant help from a 24/7 AI tutor, and pick up where you left off on the web or in the app.

Courses
51
Lessons
203

Frequently Asked Questions

Is the “Platform APIs” lesson free?

Yes — any 3 lessons of the Kotlin Academy learning path, including “Platform APIs”, are free to read in full here on the web. After that, CoddyKit PRO unlocks every lesson, plus interactive practice with a built-in code editor and a 24/7 AI tutor. The Kotlin Academy course includes 4 lessons in total.

What will I learn in “Platform APIs”?

Access native features. You practise Kotlin Academy with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.

Do I need any experience to start Kotlin Academy?

No prior experience is required. Kotlin Academy on CoddyKit is structured for beginners through advanced learners, so you can start here or from the beginning and move at your own pace. This is lesson 4 of 4.

How long does the “Platform APIs” lesson take?

Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.

Can I write and run code in this Kotlin Academy lesson?

Yes. Every Kotlin Academy lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.

All lessons in this course

  1. KMM Project Structure
  2. expect and actual
  3. Sharing Business Logic
  4. Platform APIs
← Back to Kotlin Academy