Kotlin Multiplatform Mobileを使用すると、異常な機能に遭遇します。iOSコードは、コンパイラによって、iosArm64とiosX64、およびiosArm32(iPhone 5sより前にリリースされたデバイスをサポートするため)のいくつかのバージョンで考慮されます。SwiftでiOS用に開発する場合、これらの機能はプリプロセッサの条件によってシステムライブラリのヘッダーに隠されているため、これらの機能については考慮しません。
, ( , iosArm64 iosX64). , — iosMain. ios sourceSet, .
Commonizer Kotlin 1.4
Kotlin Multiplatform KotlinSourceSet’. , sourceSet ios , .
ios iosMain sourceSet. , Kotlin 1.4 IDE , — Arm64 X64. IDE ( ):
Kotlin 1.4 IDE — Commonizer. iosArm64Main iosX64Main iosMain klib, , IDE klib. commonizer Kotlin/Native.
build.gradle.kts:
plugins {
kotlin("multiplatform")
}
kotlin {
ios {
binaries {
framework {
baseName = "shared"
}
}
}
sourceSets {
val commonMain by getting
val iosMain by getting
}
}
commonizer gradle.properties:
kotlin.mpp.enableGranularSourceSetsMetadata=true
kotlin.native.enableDependencyPropagation=false
iOS IDE.
— iOS API iosMain. , UITextFieldDelegateProtocol :
public expect interface UITextFieldDelegateProtocol : platform.darwin.NSObjectProtocol {
}
iosX64Main/iosArm64Main :
public interface UITextFieldDelegateProtocol : platform.darwin.NSObjectProtocol {
public open fun textField(textField: platform.UIKit.UITextField, shouldChangeCharactersInRange: kotlinx.cinterop.CValue<platform.Foundation.NSRange>, replacementString: kotlin.String): kotlin.Boolean
public open fun textFieldDidBeginEditing(textField: platform.UIKit.UITextField): kotlin.Unit
...
}
- cinterop ( cocoapods Kotlin) iosMain IDE ( ).
:
sourceSet IDE
gradle-
:
cInterop IDE sourceSet
1 ( iosMain appleMain ios, macos - )
API sourceSet
sourceSet ( — )
sourceSet iOS
Kotlin Multiplatform Mobile. gradle — iosX64 iosArm64. SDKNAME — Xcode . Xcode.
:
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
plugins {
kotlin("multiplatform")
}
kotlin {
val iosTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true)
::iosArm64
else
::iosX64
iosTarget("ios") {
binaries {
framework {
baseName = "shared"
}
}
}
sourceSets {
val commonMain by getting
val iosMain by getting
}
}
iosMain IDE cInterop:
:
iosMain
cInterop
:
gradle
gradle iOS,
Xcode
Arm64 sourceSet depends on X64
sourceSet . iosArm64Main iosX64Main.
:
plugins {
kotlin("multiplatform")
}
kotlin {
val ios = listOf(iosX64(), iosArm64())
configure(ios) {
binaries {
framework {
baseName = "shared"
}
}
}
sourceSets {
val commonMain by getting
val iosX64Main by getting
val iosArm64Main by getting {
dependsOn(iosX64Main)
}
}
}
iosX64Main:
:
, sourceSet
API
gradle-
cInterop
:
Kotlin 1.4 cInterop ( )
symlink Arm64 to X64
, IceRock, , API cInterop, . symlink ios sourceSet:
ln -s iosX64Main iosArm64Main
gradle ios :
plugins {
kotlin("multiplatform")
}
kotlin {
val ios = listOf(iosX64(), iosArm64())
configure(ios) {
binaries {
framework {
baseName = "shared"
}
}
}
sourceSets {
val commonMain by getting
}
}
:
:
, sourceSet, symlink
API
cinterop Kotlin
:
git symlink
IDEは、symlinkファイルの変更を自動的に認識しません(ディレクトリの再読み込みを行うか、常に同じソートセットで作業する必要があります)
Windowsでは機能しません(ただし、iOSの場合は必要ありません)