Build aplikasi iOS dari proyek Kotlin Multiplatform tanpa Mac
Dengan Kotlin Multiplatform, sebagian besar aplikasi Anda ada di kode Kotlin bersama. Anda bisa menulisnya di Windows atau Linux. Framework iOS dan aplikasi Xcode tetap butuh macOS. Kami mengujinya pada 19 Oktober 2026, dengan template KMP resmi dari JetBrains. Di bawah ini ada apa yang berhasil, dan satu jebakan.
Yang berfungsi di Windows dan Linux
Dokumentasi Kotlin bilang Anda bisa mengerjakan kode bersama dan semua platform kecuali iOS dari sistem apa pun. Kami memeriksanya dengan KMP-App-Template, template resmi dari tim Kotlin di GitHub. Ini aplikasi Compose Multiplatform untuk Android, iOS, desktop dan web. Di runner Windows dan Ubuntu, perintah ini berhasil:
./gradlew :shared:compileKotlinJvm :androidApp:assembleDebug
Kode bersama berhasil dikompilasi untuk JVM, dan aplikasi Android berhasil di-build. Anda bisa menjalankan test Android, desktop dan JVM dengan cara yang sama. Tulis logika bisnis dan UI Compose Anda di sana, lalu periksa di Android.
Jebakannya: build hijau tanpa framework iOS
Lalu kami meminta framework iOS dari runner Windows dan Ubuntu. Gradle mengompilasi Kotlin untuk iOS, lalu melewati langkah link. Ia tetap melaporkan sukses:
> Task :shared:compileKotlinIosSimulatorArm64 > Task :shared:linkDebugFrameworkIosSimulatorArm64 SKIPPED BUILD SUCCESSFUL in 27s
Tidak ada framework yang keluar. Halaman dukungan target Kotlin menjelaskan alasannya. Linux dan Windows bisa membuat library Kotlin untuk target Apple. Binary final untuk target Apple tidak bisa dibuat di sana. Langkah configure juga memperingatkan bahwa test simulator iOS butuh macOS.
Yang butuh macOS
- Link framework. Aplikasi iOS mengimpor kode bersama Anda sebagai framework, dan hanya Mac yang bisa me-link-nya.
- Proyek iosApp. Ini proyek Xcode biasa. Build phase-nya memanggil Gradle untuk menyematkan framework.
- Test iOS dan Simulator. Keduanya butuh Xcode.
- CocoaPods dan cinterop lainnya. Dokumentasi Kotlin bilang ini butuh host macOS, bahkan untuk library.
Perintah di Mac
Mac MacRun sudah berisi Xcode 27.1 dan Xcode 26.6. Belum ada JDK, jadi pasang dulu. Kami memakai Zulu JDK 21. Quickstart Kotlin menyarankan membuka Xcode sekali sebelum build pertama, agar setup-nya selesai. Lalu clone repo Anda dan link framework simulator:
./gradlew :shared:linkDebugFrameworkIosSimulatorArm64
Lalu build proyek iosApp untuk Simulator. Flag ini sama dengan file CI milik template itu. CODE_SIGNING_ALLOWED=NO melewati signing, yang memang tidak dibutuhkan build simulator.
cd iosApp xcodebuild -project iosApp.xcodeproj -scheme iosApp \ -configuration Debug -sdk iphonesimulator -arch arm64 \ -derivedDataPath build CODE_SIGNING_ALLOWED=NO build
Pertahankan -arch arm64. Percobaan pertama kami memakai destination simulator generik sebagai gantinya. Xcode lalu juga meminta slice simulator Intel dari Gradle, dan build gagal:
Xcode requested target architectures that are not configured in your Gradle build: ios_x64.
Template itu hanya mendefinisikan iosArm64 dan iosSimulatorArm64. Menambahkan -destination dan -arch sekaligus juga gagal. Xcode bilang destination sudah menentukan arsitekturnya.
Untuk membuka aplikasinya, nyalakan simulator dan pasang build-nya. Pakai bundle ID Anda sendiri. Di MacRun, runtime iOS 27.1 membawa perangkat iPhone Duo.
xcrun simctl list devices available xcrun simctl boot "iPhone Duo" xcrun simctl install booted "build/Build/Products/Debug-iphonesimulator/KMP App.app" xcrun simctl launch booted com.jetbrains.kmpapp.KMP-App-Template
Anda juga bisa membuka iosApp.xcodeproj di Xcode lewat berbagi layar. Atur tim Anda, lalu tekan Run. Dari Windows, lihat Xcode dari Windows untuk layar jarak jauh.
Workflow yang kami jalankan di GitHub Actions
Ini job macOS dari test kami. Job ini mengunci template ke satu commit, jadi Anda bisa menjalankannya apa adanya. Di repo Anda sendiri, checkout kode Anda sebagai gantinya.
name: kmp-ios
on: workflow_dispatch
env:
TEMPLATE_SHA: 6b6d09e4f3f5e845116422d59b658791ed6149c6
jobs:
macos:
runs-on: macos-26
steps:
- uses: actions/checkout@v4
with:
repository: Kotlin/KMP-App-Template
ref: ${{ env.TEMPLATE_SHA }}
- uses: actions/setup-java@v4
with:
distribution: zulu
java-version: 21
- run: xcodebuild -version && sw_vers && java -version
- name: Link the iOS simulator framework
run: time ./gradlew :shared:linkDebugFrameworkIosSimulatorArm64
- name: Build the iosApp for the Simulator
run: |
time xcodebuild -project iosApp.xcodeproj -scheme iosApp \
-configuration Debug -sdk iphonesimulator -arch arm64 \
-derivedDataPath build CODE_SIGNING_ALLOWED=NO build
working-directory: iosApp
- name: Install and launch in the Simulator
run: |
APP=$(ls -d build/Build/Products/Debug-iphonesimulator/*.app | head -1)
UDID=$(xcrun simctl list devices available -j | python3 -c "import json,sys; d=json.load(sys.stdin)['devices']; print(next(x['udid'] for k,v in d.items() if 'iOS' in k for x in v if x['name'].startswith('iPhone')))")
xcrun simctl boot "$UDID"
xcrun simctl bootstatus "$UDID"
xcrun simctl install booted "$APP"
xcrun simctl launch booted com.jetbrains.kmpapp.KMP-App-Template
sleep 10
xcrun simctl io booted screenshot shot.png && ls -la shot.png
working-directory: iosAppJob ini memakan waktu 6 menit 35 detik. Link Gradle memakan waktu 4 menit 7 detik di runner yang masih dingin, sebagian besar untuk mengunduh toolchain Kotlin/Native. Langkah xcodebuild memakan waktu 26 detik. Baris berikut diambil dari log:
Xcode 26.6 Build version 17F113 openjdk version "21.0.12" 2026-07-21 LTS BUILD SUCCESSFUL in 4m 4s 263M shared/build/bin/iosSimulatorArm64/debugFramework/Shared.framework ** BUILD SUCCEEDED ** 59M build/Build/Products/Debug-iphonesimulator/KMP App.app com.jetbrains.kmpapp.KMP-App-Template: 26325
Baris terakhir adalah aplikasi yang berjalan di Simulator. Run kami memakai Xcode 26.6, karena image GitHub tidak punya Xcode 27. Di Mac MacRun Anda bisa menyamakannya dengan sudo xcode-select -s /Applications/Xcode.app, yang di sana adalah Xcode 26.6.
Kirim ke TestFlight
Build rilis dibuat di proyek iosApp, seperti aplikasi iOS lain. Atur tim Anda di Xcode, buat archive, lalu unggah ke App Store Connect. Panduan publish kami membahas signing, API key dan review. Kami tidak menguji langkah itu, karena runner kami tidak punya akun Apple. Untuk iPhone sungguhan, pasang dari TestFlight. Mac remote tidak bisa melihat ponsel yang dicolokkan ke PC Anda.
Siapa yang sebaiknya tidak menyewa Mac untuk ini
Jika Anda hanya butuh build untuk membuktikan iOS masih bisa dikompilasi, pakai CI. Workflow di atas jalan di runner macOS GitHub Actions, ditagih per menit. Akun pribadi Codemagic mendapat 500 menit build macOS gratis per bulan. Jika Anda mengerjakan iOS setiap hari, Mac milik sendiri mungkin lebih murah dalam setahun.
Sewa Mac saat Anda perlu melihat aplikasi iOS-nya. Artinya UI Compose di layar iOS sungguhan, crash di Xcode, atau masalah signing. Pass harian MacRun seharga $15 untuk Mac mini M6 khusus, dan seminggu seharga $59. Anda bayar sekali dan tidak ada perpanjangan otomatis. Mac dihapus di akhir masa sewa, jadi push pekerjaan Anda ke git lebih dulu.
Pertanyaan yang sering diajukan
Bisakah saya build aplikasi iOS dari proyek Kotlin Multiplatform di Windows?
+
Tidak. Dokumentasi Kotlin bilang binary final untuk target Apple tidak bisa dibuat di Linux atau Windows. Kode bersama, target Android dan JVM bisa di-build dengan lancar di sana. Framework iOS dan aplikasi Xcode butuh Mac.
Kenapa Gradle bilang BUILD SUCCESSFUL untuk iOS di Windows?
+
Gradle melewati task link Apple di Linux dan Windows, alih-alih gagal. Dalam test kami, linkDebugFrameworkIosSimulatorArm64 mencetak SKIPPED, dan Gradle tetap melaporkan sukses. Tidak ada framework yang dihasilkan.
Bisakah saya menulis UI Compose Multiplatform di Windows?
+
Bisa. Dalam test kami, kode bersama dari template itu berhasil dikompilasi untuk JVM dan aplikasi Android-nya berhasil di-build di Windows. Anda hanya butuh Mac untuk build dan menjalankan UI di iOS.
Apa solusi untuk "Xcode Requested Architecture Not Configured in Gradle"?
+
Build untuk satu arsitektur saja. Kami memberikan -sdk iphonesimulator -arch arm64 ke xcodebuild, sama seperti CI milik template KMP itu. Destination simulator generik juga meminta x86_64, yang tidak didefinisikan oleh template.
Berapa lama build iOS Kotlin Multiplatform?
+
Di runner macos-26 GitHub, link framework simulator dari template itu memakan waktu sekitar 4 menit di runner yang masih dingin. Build Xcode untuk iosApp lalu memakan waktu 26 detik.
Apakah JDK sudah terpasang di Mac MacRun?
+
Tidak. Xcode 27.1, Xcode 26.6 dan simulator iOS 27.1 sudah terpasang. Anda punya hak admin dan Homebrew, jadi Anda sendiri yang memasang JDK dan apa pun yang Anda butuhkan.