Ao usar o Kotlin Multiplatform Mobile, vocĂȘ se depara com um recurso incomum - o cĂłdigo iOS Ă© considerado pelo compilador em vĂĄrias versĂ”es: iosArm64 e iosX64, bem como iosArm32 (para suportar dispositivos lançados antes do iPhone 5s). Ao desenvolver para iOS em Swift, vocĂȘ nĂŁo pensa sobre esses recursos, uma vez que estĂŁo ocultos nos cabeçalhos das bibliotecas do sistema pelas condiçÔes do prĂ©-processador.
, ( , 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
O IDE nĂŁo percebe automaticamente as mudanças nos arquivos de link simbĂłlico (vocĂȘ precisa fazer um diretĂłrio de recarga ou apenas trabalhar sempre no mesmo sortset)
nĂŁo funciona no Windows (mas para iOS nĂŁo Ă© necessĂĄrio)