Opciones para configurar ios Main sourceSet en Kotlin Multiplatform Mobile

Cuando usa Kotlin Multiplatform Mobile, se encuentra con una característica inusual: el compilador considera el código de iOS en varias versiones: iosArm64 e iosX64, así como iosArm32 (para admitir dispositivos lanzados antes del iPhone 5s). Al desarrollar para iOS en Swift, no piensa en estas características, ya que las condiciones del preprocesador las ocultan en los encabezados de las bibliotecas del sistema. 





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





Commonizer Kotlin 1.4

Kotlin Multiplatform KotlinSourceSet’. , sourceSet ios , .





iosMain en la jerarquía (fuente: 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. El IDE no nota automáticamente los cambios en los archivos de enlace simbólico (necesita hacer un directorio de recarga o simplemente trabajar siempre en el mismo conjunto de clasificación)





  3. no funciona en Windows (pero para iOS no es necesario)












All Articles