ローカルの Swift パッケージから Kotlin を使用する
- ローカル SwiftPM モジュールを持つ iOS アプリがある。
- ローカルマシンに iOS をターゲットとした Kotlin Multiplatform プロジェクトをすでにセットアップしている。
- 既存の iOS プロジェクトが静的リンク(static linking)タイプである。
このチュートリアルでは、Kotlin Multiplatform プロジェクトの Kotlin フレームワークを、Swift Package Manager (SwiftPM) を使用してローカルパッケージに統合する方法を学びます。
統合をセットアップするために、プロジェクトのビルド設定で embedAndSignAppleFrameworkForXcode Gradle タスクをプリアクション(pre-action)として使用する特別なスクリプトを追加します。共通コード(common code)に加えられた変更を Xcode プロジェクトに反映させるには、Kotlin Multiplatform プロジェクトをリビルドするだけで済みます。
この方法により、ビルドフェーズにスクリプトを追加し、共通コードの変更を反映させるために Kotlin Multiplatform と iOS プロジェクトの両方をリビルドする必要がある通常の直接統合(direct integration)方法と比較して、ローカルの Swift パッケージで Kotlin コードを簡単に使用できるようになります。
Kotlin Multiplatform に慣れていない場合は、まず環境のセットアップとクロスプラットフォームアプリケーションのゼロからの作成について学んでください。
プロジェクトのセットアップ
この機能は Kotlin 2.0.0 以降で使用可能です。
Kotlin のバージョンを確認するには、Kotlin Multiplatform プロジェクトのルートにある
build.gradle(.kts)ファイルに移動してください。ファイル上部のplugins {}ブロックで現在のバージョンを確認できます。または、
gradle/libs.versions.tomlファイルのバージョンカタログを確認してください。
このチュートリアルでは、プロジェクトがプロジェクトのビルドフェーズで embedAndSignAppleFrameworkForXcode タスクを使用する直接統合アプローチを使用していることを前提としています。CocoaPods プラグインまたは binaryTarget を使用した Swift パッケージを通じて Kotlin フレームワークを接続している場合は、先に移行を行ってください。
SPM の binaryTarget 統合からの移行
binaryTarget を使用した SwiftPM 統合から移行するには:
- Xcode で、Product | Clean Build Folder を使用するか、 ショートカットを使用してビルドディレクトリをクリーンアップします。
- すべての
Package.swiftファイルから、Kotlin フレームワークを含むパッケージへの依存関係と、プロダクトへのターゲット依存関係の両方を削除します。
CocoaPods プラグインからの移行
cocoapods {}ブロック内に他の Pod への依存関係がある場合は、CocoaPods 統合アプローチを継続する必要があります。現在、マルチモードの SwiftPM プロジェクトにおいて、Pod への依存関係と Kotlin フレームワークへの依存関係を両立させることはできません。
CocoaPods プラグインから移行するには:
Xcode で、Product | Clean Build Folder を使用するか、 ショートカットを使用してビルドディレクトリをクリーンアップします。
Podfile のあるディレクトリで、以下のコマンドを実行します:
nonepod deintegratebuild.gradle(.kts)ファイルからcocoapods {}ブロックを削除します。.podspecファイルと Podfile を削除します。
フレームワークをプロジェクトに接続する
swift buildへの統合は、現在サポートされていません。
ローカルの Swift パッケージで Kotlin コードを使用できるようにするには、マルチプラットフォームプロジェクトから生成された Kotlin フレームワークを Xcode プロジェクトに接続します:
Xcode で、Product | Scheme | Edit scheme に移動するか、トップバーのスキームアイコンをクリックして Edit scheme を選択します:

Build | Pre-actions 項目を選択し、+ | New Run Script Action をクリックします:

以下のスクリプトを調整し、アクションとして追加します:
bashcd "<Path to the root of the multiplatform project>" ./gradlew :<Shared module name>:embedAndSignAppleFrameworkForXcodecdコマンドでは、Kotlin Multiplatform プロジェクトのルートへのパスを指定します(例:$SRCROOT/..)。./gradlewコマンドでは、共有モジュールの名前を指定します(例::sharedまたは:sharedLogic)。
Provide build settings from セクションで、アプリのターゲットを選択します:

これで、ローカルの Swift パッケージに共有モジュールをインポートして Kotlin コードを使用できるようになります。
Xcode でローカルの Swift パッケージに移動し、モジュールのインポートを含む関数を定義します。例:
Swiftimport Shared public func greetingsFromSpmLocalPackage() -> String { return Greeting.greet() }
iOS プロジェクトの
ContentView.swiftファイルで、このローカルパッケージをインポートして関数を使用できるようになります:Swiftimport SwiftUI import SpmLocalPackage struct ContentView: View { var body: some View { Vstack { Image(systemName: "globe") .imageScale(.large) .foregroundStyle(.tint) Text(greetingsFromSpmLocalPackage()) } .padding() } } #Preview { ContentView() }Xcode でプロジェクトをビルドします。すべてが正しくセットアップされていれば、プロジェクトのビルドは成功します。
他に考慮すべき点がいくつかあります:
- デフォルトの
DebugまたはReleaseとは異なるカスタムビルド構成を使用している場合は、Build Settings タブの User-Defined でKOTLIN_FRAMEWORK_BUILD_TYPE設定を追加し、DebugまたはReleaseに設定してください。 - スクリプトのサンドボックス化(script sandboxing)に関するエラーが発生した場合は、プロジェクト名をダブルクリックして iOS プロジェクト設定を開き、Build Settings タブの Build Options にある User Script Sandboxing を無効にしてください。
