Skip to content

ローカルのSwiftパッケージからKotlinを使用する

これはローカルでの統合方法です。次の場合に役立ちます。
  • ローカルのSPMモジュールを持つiOSアプリがある。
  • ローカルマシンでiOSをターゲットとするKotlin Multiplatformプロジェクトを既にセットアップしている。
  • 既存のiOSプロジェクトが静的リンクタイプを使用している。

最適な統合方法を選択する

このチュートリアルでは、Swift Package Manager (SPM) を使用して、Kotlin Multiplatformプロジェクトから生成されたKotlinフレームワークをローカルパッケージに統合する方法を学習します。

Direct integration diagram

統合をセットアップするには、プロジェクトのビルド設定に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統合から移行するには:

  1. Xcodeで、Product | Clean Build Folder を使用するか、ショートカットでビルドディレクトリをクリーンアップします。
  2. すべてのPackage.swiftファイルから、Kotlinフレームワークを含むパッケージへの依存関係と、プロダクトへのターゲット依存関係の両方を削除します。

CocoaPodsプラグインからの移行

cocoapods {}ブロックに他のPodへの依存関係がある場合は、CocoaPods統合アプローチに頼る必要があります。現在、マルチモーダルSPMプロジェクトでPodとKotlinフレームワークの両方に依存関係を持つことは不可能です。

CocoaPodsプラグインから移行するには:

  1. Xcodeで、Product | Clean Build Folder を使用するか、ショートカットでビルドディレクトリをクリーンアップします。

  2. Podfileのあるディレクトリで、次のコマンドを実行します。

    none
    pod deintegrate
  3. build.gradle(.kts)ファイルからcocoapods {}ブロックを削除します。

  4. .podspecファイルとPodfileを削除します。

フレームワークをプロジェクトに接続する

swift buildへの統合は現在サポートされていません。

ローカルのSwiftパッケージでKotlinコードを使用できるようにするには、マルチプラットフォームプロジェクトから生成されたKotlinフレームワークをXcodeプロジェクトに接続します。

  1. Xcodeで、Product | Scheme | Edit scheme に移動するか、トップバーのスキームアイコンをクリックしてEdit schemeを選択します。

    Edit scheme

  2. Build | Pre-actions アイテムを選択し、+ | New Run Script Action をクリックします。

    New run script action

  3. 次のスクリプトを調整し、アクションとして追加します。

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

    Filled run script action

  5. これで、共有モジュールをローカルのSwiftパッケージにインポートして、Kotlinコードを使用できるようになります。

    Xcodeで、ローカルのSwiftパッケージに移動し、モジュールのインポートを伴う関数を定義します。例:

    Swift
    import Shared
    
    public func greetingsFromSpmLocalPackage() -> String {
        return Greeting.greet()
    }

    SPM usage

  6. iOSプロジェクトのContentView.swiftファイルで、ローカルパッケージをインポートすることでこの関数を使用できるようになりました。

    Swift
    import SwiftUI
    import SpmLocalPackage
    
    struct ContentView: View {
        var body: some View {
            Vstack {
                Image(systemName: "globe")
                    .imageScale(.large)
                    .foregroundStyle(.tint)
                Text(greetingsFromSpmLocalPackage())
            }
            .padding()
        }
    }
    
    #Preview {
        ContentView()
    }
  7. Xcodeでプロジェクトをビルドします。すべてが正しく設定されていれば、プロジェクトのビルドは成功します。

考慮すべき点が他にもいくつかあります。

  • デフォルトのDebugまたはReleaseとは異なるカスタムビルド設定を使用している場合は、Build SettingsタブのUser-DefinedセクションにKOTLIN_FRAMEWORK_BUILD_TYPE設定を追加し、DebugまたはReleaseに設定します。
  • スクリプトのサンドボックス化に関するエラーが発生した場合は、プロジェクト名をダブルクリックしてiOSプロジェクト設定を開き、Build SettingsタブでBuild Optionsの下にあるUser Script Sandboxingを無効にします。

次のステップ