ローカルのSwiftパッケージからKotlinを使用する
- ローカルのSPMモジュールを持つiOSアプリがある。
- ローカルマシンでiOSをターゲットとするKotlin Multiplatformプロジェクトを既にセットアップしている。
- 既存のiOSプロジェクトが静的リンクタイプを使用している。
このチュートリアルでは、Swift Package Manager (SPM) を使用して、Kotlin Multiplatformプロジェクトから生成されたKotlinフレームワークをローカルパッケージに統合する方法を学習します。
統合をセットアップするには、プロジェクトのビルド設定にembedAndSignAppleFrameworkForXcode Gradleタスクをプリ実行アクションとして使用する特別なスクリプトを追加します。共通コードで行われた変更がXcodeプロジェクトに反映されるのを確認するには、Kotlin Multiplatformプロジェクトをリビルドするだけで済みます。
この方法は、スクリプトをビルドフェーズに追加し、共通コードからの変更を取得するためにKotlin MultiplatformプロジェクトとiOSプロジェクトの両方のリビルドが必要な通常の直接統合方法と比較して、ローカルのSwiftパッケージでKotlinコードを簡単に使用できるようにします。
Kotlin Multiplatformに慣れていない場合は、まず環境のセットアップとクロスプラットフォームアプリケーションのゼロからの作成について学習してください。
プロジェクトをセットアップする
この機能はKotlin 2.0.0以降で利用可能です。
Kotlinのバージョンを確認するには、Kotlin Multiplatformプロジェクトのルートにある
build.gradle(.kts)ファイルに移動します。ファイルの先頭にあるplugins {}ブロックに現在のバージョンが表示されます。あるいは、
gradle/libs.versions.tomlファイルでバージョンカタログを確認することもできます。
このチュートリアルでは、プロジェクトがembedAndSignAppleFrameworkForXcodeタスクをプロジェクトのビルドフェーズで使用する直接統合アプローチを採用していることを前提としています。KotlinフレームワークをCocoaPodsプラグインまたはbinaryTargetを使用したSwiftパッケージを介して接続している場合は、まず移行してください。
SPMのbinaryTarget統合からの移行
binaryTargetを使用したSPM統合から移行するには:
- Xcodeで、Product | Clean Build Folder を使用するか、ショートカットでビルドディレクトリをクリーンアップします。
- すべての
Package.swiftファイルから、Kotlinフレームワークを含むパッケージへの依存関係と、プロダクトへのターゲット依存関係の両方を削除します。
CocoaPodsプラグインからの移行
cocoapods {}ブロックに他のPodへの依存関係がある場合は、CocoaPods統合アプローチに頼る必要があります。現在、マルチモーダルSPMプロジェクトで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または:composeApp)を指定します。
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に設定します。 - スクリプトのサンドボックス化に関するエラーが発生した場合は、プロジェクト名をダブルクリックしてiOSプロジェクト設定を開き、Build SettingsタブでBuild Optionsの下にあるUser Script Sandboxingを無効にします。
