Optionen zum Konfigurieren des iosMain sourceSet in Kotlin Multiplatform Mobile

Bei der Verwendung von Kotlin Multiplatform Mobile stoßen Sie auf eine ungewöhnliche Funktion: Der iOS-Code wird vom Compiler in mehreren Versionen berücksichtigt: iosArm64 und iosX64 sowie iosArm32 (zur Unterstützung von Geräten, die vor dem iPhone 5s veröffentlicht wurden). Bei der Entwicklung für iOS unter Swift denken Sie nicht an diese Funktionen, da sie durch die Präprozessorbedingungen in den Headern der Systembibliotheken verborgen sind. 





, ( , iosArm64 iosX64). ,  — iosMain. ios sourceSet, .





Commonizer Kotlin 1.4

Kotlin Multiplatform KotlinSourceSet’. , sourceSet ios , .





iosMain in der Hierarchie (Quelle: https://kotlinlang.org/docs/reference/mpp-share-on-platforms.html)
iosMain (source — https://kotlinlang.org/docs/reference/mpp-share-on-platforms.html)

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 ( ).





GitHub.





:





  1. sourceSet IDE





  2. gradle-





:





  1. cInterop IDE sourceSet





  2. 1 ( iosMain appleMain ios, macos - )





  3. API sourceSet





  4. 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:





GitHub.





:





  1. iosMain





  2. cInterop





:





  1. gradle





  2. gradle iOS,





  3. 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:





GitHub.





:





  1. , sourceSet





  2. API





  3. gradle-





  4. cInterop





:





  1. 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
    }
}
      
      



:





GitHub.





:





  1. , sourceSet, symlink





  2. API





  3. cinterop Kotlin





:





  1. git symlink





  2. Die IDE bemerkt Änderungen an Symlink-Dateien nicht automatisch (Sie müssen ein Neuladeverzeichnis erstellen oder arbeiten immer in derselben Sortierung).





  3. funktioniert nicht unter Windows (aber für iOS ist es nicht notwendig)












All Articles