iOS依存関係の追加
Apple SDKの依存関係(FoundationやCore Bluetoothなど)は、Kotlin Multiplatformプロジェクトにおいて事前ビルド済みのライブラリセットとして利用可能です。これらには追加の設定は必要ありません。
また、iOSソースセットでは、iOSエコシステムの他のライブラリやフレームワークを再利用することもできます。Kotlinは、APIが @objc 属性によってObjective-Cにエクスポートされている場合、Objective-CおよびSwiftの依存関係との相互運用をサポートしています。純粋な(Pure)Swiftの依存関係はまだサポートされていません。
Kotlin MultiplatformプロジェクトでiOSの依存関係を処理するには、cinteropツールで管理するか、CocoaPods依存関係マネージャーを使用します(純粋なSwiftのPodはサポートされていません)。
cinteropを使用する
cinteropツールを使用して、Objective-CまたはSwiftの宣言に対するKotlinバインディングを作成できます。これにより、Kotlinコードからそれらを呼び出すことができるようになります。
手順はライブラリとフレームワークで若干異なりますが、一般的なワークフローは以下の通りです:
- 依存関係をダウンロードする。
- バイナリを取得するためにビルドする。
- この依存関係をcinteropに説明するための特別な
.def定義ファイルを作成する。 - ビルド中にバインディングを生成するようにビルドスクリプトを調整する。
ライブラリを追加する
ライブラリのソースコードをダウンロードし、プロジェクトから参照できる場所に配置します。
ライブラリをビルドし(通常、ライブラリの作成者がビルド方法のガイドを提供しています)、バイナリへのパスを取得します。
プロジェクト内に、例えば
DateTools.defのような.defファイルを作成します。このファイルに最初の文字列を追加します:
language = Objective-C。純粋なCの依存関係を使用する場合は、languageプロパティを省略してください。2つの必須プロパティの値を指定します:
headersは、cinteropによって処理されるヘッダーを記述します。packageは、これらの宣言を配置するパッケージ名を設定します。
例:
noneheaders = DateTools.h package = DateToolsビルドスクリプトにこのライブラリとの相互運用に関する情報を追加します:
.defファイルへのパスを渡します。.defファイルがcinteropと同じ名前で、src/nativeInterop/cinterop/ディレクトリに配置されている場合、このパスは省略可能です。includeDirsオプションを使用して、cinteropにヘッダーファイルを探す場所を伝えます。- ライブラリバイナリへのリンクを設定します。
kotlinkotlin { iosArm64() { compilations.getByName("main") { val DateTools by cinterops.creating { // .defファイルへのパス definitionFile.set(project.file("src/nativeInterop/cinterop/DateTools.def")) // ヘッダー検索のためのディレクトリ(コンパイラオプションの -I<path> に相当) includeDirs("include/this/directory", "path/to/another/directory") } val anotherInterop by cinterops.creating { /* ... */ } } binaries.all { // ライブラリにリンクするために必要なリンカーオプション linkerOpts("-L/path/to/library/binaries", "-lbinaryname") } } }groovykotlin { iosArm64 { compilations.main { cinterops { DateTools { // .defファイルへのパス definitionFile = project.file("src/nativeInterop/cinterop/DateTools.def") // ヘッダー検索のためのディレクトリ(コンパイラオプションの -I<path> に相当) includeDirs("include/this/directory", "path/to/another/directory") } anotherInterop { /* ... */ } } } binaries.all { // ライブラリにリンクするために必要なリンカーオプション linkerOpts "-L/path/to/library/binaries", "-lbinaryname" } } }プロジェクトをビルドします。
これで、Kotlinコードでこの依存関係を使用できるようになります。そのためには、.def ファイルの package プロパティで設定したパッケージをインポートします。上記の例の場合、以下のようになります:
import DateTools.*cinteropツールとlibcurlライブラリを使用したサンプルプロジェクトを参照してください。
フレームワークを追加する
フレームワークのソースコードをダウンロードし、プロジェクトから参照できる場所に配置します。
フレームワークをビルドし(通常、フレームワークの作成者がビルド方法のガイドを提供しています)、バイナリへのパスを取得します。
プロジェクト内に、例えば
MyFramework.defのような.defファイルを作成します。このファイルに最初の文字列を追加します:
language = Objective-C。純粋なCの依存関係を使用する場合は、languageプロパティを省略してください。これら2つの必須プロパティの値を指定します:
modules– cinteropによって処理されるフレームワークの名前。package– これらの宣言を配置するパッケージ名。
例:
nonemodules = MyFramework package = MyFrameworkビルドスクリプトにフレームワークとの相互運用に関する情報を追加します:
.defファイルへのパスを渡します。.defファイルがcinteropと同じ名前で、src/nativeInterop/cinterop/ディレクトリに配置されている場合、このパスは省略可能です。-frameworkオプションを使用して、コンパイラとリンカーにフレームワーク名を渡します。-Fオプションを使用して、コンパイラとリンカーにフレームワークのソースとバイナリへのパスを渡します。
kotlinkotlin { iosArm64() { compilations.getByName("main") { val DateTools by cinterops.creating { // .defファイルへのパス definitionFile.set(project.file("src/nativeInterop/cinterop/DateTools.def")) compilerOpts("-framework", "MyFramework", "-F/path/to/framework/") } val anotherInterop by cinterops.creating { /* ... */ } } binaries.all { // リンカーにフレームワークの場所を伝える linkerOpts("-framework", "MyFramework", "-F/path/to/framework/") } } }groovykotlin { iosArm64 { compilations.main { cinterops { DateTools { // .defファイルへのパス definitionFile = project.file("src/nativeInterop/cinterop/MyFramework.def") compilerOpts("-framework", "MyFramework", "-F/path/to/framework/") } anotherInterop { /* ... */ } } } binaries.all { // リンカーにフレームワークの場所を伝える linkerOpts "-framework", "MyFramework", "-F/path/to/framework/" } } }プロジェクトをビルドします。
これで、Kotlinコードでこの依存関係を使用できるようになります。そのためには、.def ファイルの package プロパティで設定したパッケージをインポートします。上記の例の場合、以下のようになります:
import MyFramework.*Swift/Objective-Cの相互運用およびGradleからのcinteropの設定の詳細をご覧ください。
CocoaPodsを使用する
CocoaPods統合の初期セットアップを実行します。
プロジェクトの
build.gradle(.kts)にpod()関数の呼び出しを含めることで、使用したいCocoaPodsリポジトリのPodライブラリへの依存関係を追加します。kotlinkotlin { cocoapods { version = "2.0" //.. pod("SDWebImage") { version = "5.20.0" } } }groovykotlin { cocoapods { version = '2.0' //.. pod('SDWebImage') { version = '5.20.0' } } }Podライブラリに対して、以下の依存関係を追加できます:
IntelliJ IDEAで Build | Reload All Gradle Projects を実行(またはAndroid Studioで File | Sync Project with Gradle Files を実行)して、プロジェクトを再インポートします。
Kotlinコードで依存関係を使用するには、パッケージ cocoapods.<library-name> をインポートします。上記の例の場合、以下のようになります:
import cocoapods.SDWebImage.*
- Kotlinプロジェクトで設定されたさまざまなPod依存関係のサンプルプロジェクトをご覧ください。
- 複数のターゲットを持つXcodeプロジェクトがKotlinライブラリに依存しているサンプルプロジェクトを確認してください。
次のステップ
マルチプラットフォームプロジェクトでの依存関係の追加に関する他のリソースを確認し、以下について詳しく学びましょう:
