ガイド

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など必要なものは自分でインストールします。

関連ガイド