MacなしでKotlin MultiplatformプロジェクトのiOSアプリをビルドする
Kotlin Multiplatformでは、アプリの大部分が共有のKotlinコードになります。これはWindowsでもLinuxでも書けます。それでも、iOSのフレームワークとXcodeのアプリにはmacOSが必要です。当社は2026年10月19日に、JetBrainsの公式KMPテンプレートでこれを試しました。以下は、うまくいったことと、1つの落とし穴です。
WindowsとLinuxでできること
Kotlinのドキュメントによると、共有コードと、iOS以外のすべてのプラットフォームの作業は、どのシステムからでもできます。当社はこれをKMP-App-Templateで確かめました。GitHubにある、Kotlinチームの公式テンプレートです。Android、iOS、デスクトップ、Web向けのCompose Multiplatformアプリです。WindowsとUbuntuのrunnerでは、次のコマンドが通りました。
./gradlew :shared:compileKotlinJvm :androidApp:assembleDebug
共有コードはJVM向けにコンパイルされ、Androidアプリもビルドできました。Android、デスクトップ、JVMのテストも同じように実行できます。ビジネスロジックとCompose UIはそこで書き、Androidで確認します。
落とし穴:成功と表示されるのに、iOSのフレームワークがない
次に、WindowsとUbuntuのrunnerでiOSのフレームワークを作ろうとしました。GradleはiOS向けにKotlinをコンパイルしましたが、リンクの工程はスキップしました。それでも成功と表示しました。
> Task :shared:compileKotlinIosSimulatorArm64 > Task :shared:linkDebugFrameworkIosSimulatorArm64 SKIPPED BUILD SUCCESSFUL in 27s
フレームワークはできませんでした。理由はKotlinのターゲット対応ページに書かれています。LinuxとWindowsでも、Appleのターゲット向けのKotlinライブラリは作れます。しかし、Appleのターゲット向けの最終的なバイナリは、そこではビルドできません。設定の工程でも、iOSシミュレータのテストにはmacOSが必要だと警告が出ました。
macOSが必要なもの
- フレームワークのリンク。iOSアプリは共有コードをフレームワークとして読み込みます。それをリンクできるのはMacだけです。
- iosAppプロジェクト。普通のXcodeプロジェクトです。そのビルドフェーズがGradleを呼び出して、フレームワークを組み込みます。
- iOSのテストとシミュレータ。どちらもXcodeが必要です。
- CocoaPodsなどのcinterop。Kotlinのドキュメントによると、ライブラリであってもmacOSのホストが必要です。
Macで実行するコマンド
MacRunのMacには、Xcode 27.1とXcode 26.6が入っています。JDKは入っていないので、先にインストールします。当社はZulu JDK 21を使いました。Kotlinのクイックスタートによると、最初のビルドの前にXcodeを一度開いて、セットアップを終わらせておきます。そのあとリポジトリをクローンし、シミュレータ用のフレームワークをリンクします。
./gradlew :shared:linkDebugFrameworkIosSimulatorArm64
次に、iosAppプロジェクトをシミュレータ向けにビルドします。このフラグは、テンプレート自体のCIファイルと同じです。CODE_SIGNING_ALLOWED=NOで署名をスキップします。シミュレータ向けのビルドには署名は要りません。
cd iosApp xcodebuild -project iosApp.xcodeproj -scheme iosApp \ -configuration Debug -sdk iphonesimulator -arch arm64 \ -derivedDataPath build CODE_SIGNING_ALLOWED=NO build
-arch arm64は外さないでください。最初の試みでは、代わりに汎用のシミュレータのdestinationを使いました。するとXcodeは、Intelのシミュレータ用のスライスもGradleに求め、ビルドが失敗しました。
Xcode requested target architectures that are not configured in your Gradle build: ios_x64.
テンプレートが定義しているのは、iosArm64とiosSimulatorArm64だけです。-destinationと-archを両方付けても失敗しました。destinationがすでにアーキテクチャを決めている、とXcodeに言われました。
アプリを開くには、シミュレータを起動してビルドをインストールします。バンドルIDは自分のものを使ってください。MacRunでは、iOS 27.1のランタイムに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
画面共有でiosApp.xcodeprojをXcodeで開くこともできます。チームを設定して、Runを押します。Windowsからリモートの画面を使うには、WindowsからXcodeをご覧ください。
GitHub Actionsで実行したワークフロー
これは当社のテストのmacOSジョブです。テンプレートを1つのコミットに固定しているので、そのまま実行できます。自分のリポジトリでは、代わりに自分のコードをチェックアウトしてください。
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: iosAppジョブは6分35秒でした。何もキャッシュのないrunnerで、Gradleのリンクに4分7秒かかりました。その大半はKotlin/Nativeのツールチェーンのダウンロードです。xcodebuildの工程は26秒でした。次の行はログからの抜粋です。
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
最後の行は、シミュレータでアプリが動いていることを示します。GitHubのイメージにはXcode 27がないので、この実行ではXcode 26.6を使いました。MacRunのMacで同じ環境にするには、sudo xcode-select -s /Applications/Xcode.appを実行します。MacRunではこれがXcode 26.6です。
TestFlightに出す
リリースビルドは、ほかのiOSアプリと同じく、iosAppプロジェクトで行います。Xcodeでチームを設定し、アーカイブして、App Store Connectにアップロードします。署名、APIキー、審査については公開ガイドをご覧ください。当社のrunnerにはAppleのアカウントがなかったので、これらの工程は試していません。実機のiPhoneでは、TestFlightからインストールします。リモートのMacからは、PCにつないだスマートフォンは見えません。
この用途でMacを借りるべきでない人
iOSのコンパイルがまだ通ることを確かめるビルドだけが必要なら、CIを使ってください。上のワークフローは、GitHub ActionsのmacOS runnerで分単位の課金で動きます。Codemagicの個人アカウントには、macOSのビルド時間が毎月500分、無料で含まれます。毎日iOSの作業をするなら、自分のMacのほうが1年で見て安いかもしれません。
iOSアプリを目で見る必要があるときは、Macを借りてください。本物のiOSの画面でのCompose UI、Xcodeでのクラッシュ、署名の問題などです。MacRunの1日パスは、専用のM6 Mac miniが$15で、1週間は$59です。支払いは1回だけで、自動更新はありません。期間が終わるとMacのデータは消去されるので、先に作業をgitにpushしてください。
よくある質問
Kotlin MultiplatformプロジェクトのiOSアプリをWindowsでビルドできますか?
+
できません。Kotlinのドキュメントによると、Appleのターゲット向けの最終的なバイナリは、LinuxやWindowsではビルドできません。共有コード、Android、JVMのターゲットは問題なくビルドできます。iOSのフレームワークとXcodeのアプリにはMacが必要です。
WindowsでiOS向けにビルドすると、GradleがBUILD SUCCESSFULと表示するのはなぜですか?
+
LinuxとWindowsでは、GradleはAppleのリンクのタスクを失敗させずにスキップします。当社のテストでは、linkDebugFrameworkIosSimulatorArm64がSKIPPEDと表示され、それでもGradleは成功と報告しました。フレームワークはできていません。
Compose MultiplatformのUIはWindowsで書けますか?
+
書けます。当社のテストでは、テンプレートの共有コードがJVM向けにコンパイルされ、AndroidアプリもWindowsでビルドできました。Macが必要なのは、iOSでUIをビルドして動かすときだけです。
"Xcode Requested Architecture Not Configured in Gradle"はどうすれば直りますか?
+
1つのアーキテクチャ向けにビルドします。当社は、KMPテンプレート自体のCIと同じく、xcodebuildに-sdk iphonesimulator -arch arm64を渡しました。汎用のシミュレータのdestinationでは、テンプレートが定義していないx86_64も求められました。
Kotlin MultiplatformのiOSビルドには、どのくらい時間がかかりますか?
+
GitHubのmacos-26 runnerでは、キャッシュのない状態で、テンプレートのシミュレータ用フレームワークのリンクに約4分かかりました。そのあとのiosAppのXcodeビルドは26秒でした。
MacRunのMacにはJDKが入っていますか?
+
入っていません。Xcode 27.1、Xcode 26.6、iOS 27.1のシミュレータがインストール済みです。管理者権限とHomebrewが使えるので、JDKなど必要なものは自分でインストールします。