iOS依存関係の追加
Apple SDKの依存関係(FoundationやCore Bluetoothなど)は、Kotlin Multiplatformプロジェクトにおいて、ビルド済みライブラリのセットとして利用可能です。これらは追加の設定を必要としません。
また、iOSのソースセットでiOSエコシステム内の他のライブラリやフレームワークを再利用することもできます。Kotlinは、APIが@objc
属性でObjective-Cにエクスポートされている場合、Objective-Cの依存関係やSwiftの依存関係との相互運用をサポートします。純粋な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/") } } }
- .defファイルへのパスを渡します。
プロジェクトをビルドします。
これで、この依存関係をKotlinコードで使用できます。そのためには、.def
ファイルのpackageプロパティで設定したパッケージをインポートします。上記の例では次のようになります。
import MyFramework.*
Swift/Objective-Cの相互運用と、Gradleからのcinteropの設定について詳しく学びましょう。
CocoaPodsを使用する
CocoaPods統合の初期設定を行います。
使用したいCocoaPodsリポジトリからのPodライブラリへの依存関係を、プロジェクトの
build.gradle(.kts)
に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ライブラリに依存するサンプルプロジェクトを確認してください。
次のステップ
マルチプラットフォームプロジェクトでの依存関係の追加に関する他のリソースを確認し、以下について詳しく学びましょう: