首页 > 解决方案 > Kotlin 使用定义的最低 iOS 版本构建 FatFramework

问题描述

我想使用此 gradle 配置使用 FatFramework 将我的多平台项目部署到支持 iOS 架构的 .framework。这是可行的,但我在 info.plist 中发现它具有 iOS 9 的默认 MinimumOSVersion,因此我无法使用低于该版本的库。

有没有办法/可以为我的 lib 配置最低 iOS 版本?

import org.jetbrains.kotlin.gradle.tasks.FatFrameworkTask

    plugins {
        id("org.jetbrains.kotlin.multiplatform") version "1.3.61"
        id("maven-publish")
        id("com.jfrog.bintray") version "1.8.4"
        id("org.jetbrains.dokka") version "0.10.0"
    }

    group = "com.example.lib"
    version = "1.0.0"


    repositories {
        mavenCentral()
        jcenter()
    }


    kotlin {
        jvm()
        val iosX64 = iosX64("ios")
        val iosArm64 = iosArm64("iosArm64")
        val iosArm32 = iosArm32("iosArm32")

        val frameworkName = "EXAMPLE-LIB"

        configure(listOf(iosX64, iosArm64, iosArm32)) {
            binaries.framework {
                baseName = frameworkName
            }
        }

        sourceSets {
            named("commonMain") {
                dependencies {
                    implementation(kotlin("stdlib-common"))
                    implementation(kotlin("stdlib-jdk7"))
                    implementation(kotlin("stdlib-jdk8"))
                    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.3.0-RC")
                    implementation(kotlin("reflect"))
                }
            }
            named("commonTest") {
                dependencies {
                    implementation(kotlin("test-common"))
                    implementation(kotlin("test-annotations-common"))
                    implementation(kotlin("reflect"))
                }
            }
            named("jvmMain") {
                dependencies {
                    implementation(kotlin("stdlib-jdk8"))
                }
            }
            named("jvmTest") {
                dependencies {
                    implementation(kotlin("test"))
                    implementation(kotlin("test-junit"))
                }
            }
            val iosMain by getting {
                dependencies {
                    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.3.0-RC")
                    implementation("io.ktor:ktor-client-ios:1.2.6")
                }
            }
            val iosArm64Main by getting {
                dependencies {
                    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.3.0-RC")
                    implementation("io.ktor:ktor-client-ios:1.2.6")
                }
            }
            val iosArm32Main by getting {
                dependencies {
                    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.3.0-RC")
                    implementation("io.ktor:ktor-client-ios:1.2.6")
                }
            }
        }

        val debugFatFramework by tasks.creating(FatFrameworkTask::class) {
            baseName = frameworkName
            from(
                iosArm32.binaries.getFramework("debug"),
                iosArm64.binaries.getFramework("debug"),
                iosX64.binaries.getFramework("debug")
            )
            destinationDir = buildDir.resolve("fat-framework/debug")
            group = "Universal framework"
            description = "Builds a debug universal (fat) framework"
        }

        val releaseFatFramework by tasks.creating(FatFrameworkTask::class) {
            baseName = frameworkName
            from(
                iosArm32.binaries.getFramework("release"),
                iosArm64.binaries.getFramework("release"),
                iosX64.binaries.getFramework("release")
            )
            destinationDir = buildDir.resolve("fat-framework/release")
            group = "Universal framework"
            description = "Builds a release universal (fat) framework"
        }

        val zipDebugFatFramework by tasks.creating(Zip::class) {
            dependsOn(debugFatFramework)
            from(debugFatFramework)
            from("LICENSE.md")
        }

        val zipReleaseFatFramework by tasks.creating(Zip::class) {
            dependsOn(releaseFatFramework)
            from(releaseFatFramework)
            from("LICENSE.md")
        }


    }

    tasks.register<Exec>("generateThriftModels") {
        executable = "java"
        args(
            "-jar", "thrifty-compiler.jar",
            "--lang", "kotlin",
            "--omit-generated-annotations",
            "--list-type=kotlin.collections.ArrayList",
            "--set-type=kotlin.collections.LinkedHashSet",
            "--out", "src/commonMain/kotlin",
            "--path", "./thrift/",
            "./thrift/nativeapp.thrift"
        )
    }

标签: kotlin-coroutineskotlin-multiplatform

解决方案


此参数源自 Kotlin/Native 的编译器属性列表。可以在那里找到:~/.konan/kotlin-native-prebuilt-<hostname>-<version>/konan/konan.properties. 负责的值MinimumOSVersionosVersionMin.<target_name>。这应该针对每个目标进行设置。它可以手动更改,所有项目都将使用这个新值。

此外,在 1.4.30 之后,还有一种指定编译器属性的新方法。例如,参见文档。我建议按如下方式使用它:

...    
        configure(listOf(iosX64, iosArm64, iosArm32)) {
            binaries.framework {
                freeCompilerArgs += listOf("-Xoverride-konan-properties=osVersionMin.ios_arm32=7;osVersionMin.ios_arm64=7;osVersionMin.ios_x64=7")
            }
        }
...

推荐阅读