Ios Kotlin多平台-错误ITMS-90171:包结构无效

Ios Kotlin多平台-错误ITMS-90171:包结构无效,ios,xcode,kotlin,app-store,kotlin-multiplatform,Ios,Xcode,Kotlin,App Store,Kotlin Multiplatform,我在Apple app Store上尝试使用Kotlin Multiplatform分发iOS应用程序时遇到问题: 错误ITMS-90171:“无效的捆绑包结构-不允许使用二进制文件'Smiledu_app.app/Frameworks/shared.framework/shared'。您的应用程序不能包含独立的可执行文件或库,只能包含有效的CbundleExecutable受支持的捆绑包。有关iOS应用程序捆绑包结构的信息,请参阅的捆绑包编程指南。” 我检查了它在构建阶段->复制捆绑资源

我在Apple app Store上尝试使用Kotlin Multiplatform分发iOS应用程序时遇到问题:

错误ITMS-90171:“无效的捆绑包结构-不允许使用二进制文件'Smiledu_app.app/Frameworks/shared.framework/shared'。您的应用程序不能包含独立的可执行文件或库,只能包含有效的CbundleExecutable受支持的捆绑包。有关iOS应用程序捆绑包结构的信息,请参阅的捆绑包编程指南。”

我检查了它在构建阶段->复制捆绑资源中是否不存在

这是我的身材。gradle.kts

import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget

plugins {
    kotlin("multiplatform")
    kotlin("native.cocoapods")
    kotlin("plugin.serialization")
    id("com.android.library")
    id("kotlin-android-extensions")
    id("com.squareup.sqldelight")
}

repositories {
    gradlePluginPortal()
    google()
    jcenter()
    mavenCentral()
    maven {
        url = uri("https://dl.bintray.com/kotlin/kotlin-eap")
    }
}

dependencies {
    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.2.0")
}

configurations {
    create("compileClasspath")
}

android {
    compileSdkVersion(29)
    sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
    defaultConfig {
        minSdkVersion(24)
        targetSdkVersion(29)
        versionCode = 1
        versionName = "1.0"
    }
    buildTypes {
        getByName("release") {
            isMinifyEnabled = false
        }
    }
}

val libName = "shared"

kotlin {
    android()
    ios {
        binaries.framework(libName)
    }

    val coroutinesVersion = "1.4.1-native-mt"
    val serializationVersion = "1.0.0-RC"
    val ktorVersion = "1.4.0"
    val sqlDelightVersion = "1.4.3"
    val reactive_version = "1.1.18"

    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlin:kotlin-stdlib-common")

                // Coroutines
                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.3.2")

                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion")
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:$serializationVersion")

                //  KTOR
                implementation("io.ktor:ktor-client-core:$ktorVersion")
                implementation("io.ktor:ktor-client-json:$ktorVersion")
                implementation("io.ktor:ktor-client-serialization:$ktorVersion")

                // SQLDELIGHT
                implementation("com.squareup.sqldelight:runtime:$sqlDelightVersion")

                // Reactive
                implementation("com.badoo.reaktive:reaktive:$reactive_version")
            }
        }
        val androidMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlin:kotlin-stdlib")

                implementation("androidx.core:core-ktx:1.3.2")
                implementation("io.ktor:ktor-client-android:$ktorVersion")
                implementation("com.squareup.sqldelight:android-driver:$sqlDelightVersion")

                implementation("androidx.lifecycle:lifecycle-extensions:2.2.0")
            }
        }
        val iosMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.3.2")

                // HTTP
                implementation("io.ktor:ktor-client-ios:$ktorVersion")
                implementation("com.squareup.sqldelight:native-driver:$sqlDelightVersion")
            }
        }

        all {
            languageSettings.apply {
                progressiveMode = true
                useExperimentalAnnotation("kotlin.RequiresOptIn")
                useExperimentalAnnotation("kotlinx.coroutines.ExperimentalCoroutinesApi")
            }
        }
    }
}

val packForXcode by tasks.creating(Sync::class) {
    group = "build"
    val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
    val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator"
    val targetName = "ios" + if (sdkName.startsWith("iphoneos")) "Arm64" else "X64"
    val framework = kotlin.targets.getByName<KotlinNativeTarget>(targetName).binaries.getFramework(mode)
    inputs.property("mode", mode)
    dependsOn(framework.linkTask)
    val targetDir = File(buildDir, "xcode-frameworks")
    from({ framework.outputDirectory })
    into(targetDir)
}
tasks.getByName("build").dependsOn(packForXcode)

sqldelight {
    database("SmileduDataBase") {
        packageName = "com.example.smiledu"
        schemaOutputDirectory = file("src/commonMain/db/databases")
    }
}
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
插件{
科特林(“多平台”)
科特林(“土生土长的椰子荚”)
kotlin(“plugin.serialization”)
id(“com.android.library”)
id(“kotlin android扩展”)
id(“com.squareup.sqldelight”)
}
存储库{
gradlePluginPortal()
谷歌()
jcenter()
mavenCentral()
马文{
url=uri(“https://dl.bintray.com/kotlin/kotlin-eap")
}
}
依赖关系{
实施(“androidx.lifecycle:lifecycle livedata ktx:2.2.0”)
}
配置{
创建(“compileClasspath”)
}
安卓{
编译DK版本(29)
sourceset[“main”].manifest.srcFile(“src/androidMain/AndroidManifest.xml”)
默认配置{
明斯克版本(24)
targetSdkVersion(29)
版本代码=1
versionName=“1.0”
}
建筑类型{
getByName(“发布”){
isMinifyEnabled=false
}
}
}
val libName=“共享”
科特林{
安卓()
ios{
框架(libName)
}
val coroutinesVersion=“1.4.1-native-mt”
val serializationVersion=“1.0.0-RC”
val ktorVersion=“1.4.0”
val sqlexpressionversion=“1.4.3”
val reactive_version=“1.1.18”
源集{
通过获取{
依赖关系{
实现(“org.jetbrains.kotlin:kotlin stdlib common”)
//协同程序
实现(“org.jetbrains.kotlinx:kotlinx coroutines core common:1.3.2”)
实现(“org.jetbrains.kotlinx:kotlinx coroutines core:$coroutinesVersion”)
实现(“org.jetbrains.kotlinx:kotlinx序列化核心:$serializationVersion”)
//克托尔
实现(“io.ktor:ktor客户端核心:$ktor版本”)
实现(“io.ktor:ktor客户端json:$ktorVersion”)
实现(“io.ktor:ktor客户端序列化:$ktorVersion”)
//SQLDELIGHT
实现(“com.squareup.sqldelight:runtime:$sqlDelightVersion”)
//反应性
实现(“com.badoo.reaktive:reaktive:$reactive_version”)
}
}
val androidMain通过获取{
依赖关系{
实现(“org.jetbrains.kotlin:kotlin stdlib”)
实施(“androidx.core:core-ktx:1.3.2”)
实现(“io.ktor:ktor客户端android:$ktor版本”)
实现(“com.squareup.sqldelight:android驱动程序:$sqlDelightVersion”)
实施(“androidx.lifecycle:生命周期扩展:2.2.0”)
}
}
通过获得{
依赖关系{
实现(“org.jetbrains.kotlinx:kotlinx coroutines核心本机:1.3.2”)
//HTTP
实现(“io.ktor:ktor客户端ios:$ktorVersion”)
实现(“com.squareup.sqldelight:本机驱动程序:$sqlDelightVersion”)
}
}
全部{
languageSettings.apply{
progressiveMode=true
使用实验符号(“kotlin.requireseptin”)
使用ExperimentalAnnotation(“kotlinx.coroutines.ExperimentalRoutinesAPI”)
}
}
}
}
val packForXcode by tasks.creating(Sync::class){
group=“build”
val mode=System.getenv(“配置”)?:“调试”
val sdkName=System.getenv(“SDK_名称”)?:“iphonesimulator”
val targetName=“ios”+if(sdkName.startsWith(“iphoneos”)“Arm64”或“X64”
val framework=kotlin.targets.getByName(targetName).binaries.getFramework(模式)
属性(“模式”,模式)
dependsOn(framework.linkTask)
val targetDir=File(buildDir,“xcode框架”)
来自({framework.outputDirectory})
进入(targetDir)
}
tasks.getByName(“构建”).dependsOn(packForXcode)
sqldelight{
数据库(“SmileduDataBase”){
packageName=“com.example.smiledu”
schemaOutputDirectory=file(“src/commonMain/db/databases”)
}
}

从“嵌入框架”部分删除“shared.framework”可能会解决您的问题。请确保在将生成推送到TestFlight之前在本地验证该生成。

您好,请检查“复制捆绑资源”步骤中是否包含您的
共享框架
:-
您的目标应用程序
->
生成阶段
->
复制捆绑资源
是的,复制捆绑资源中不存在该框架。我已经更新了帖子,看看这个你好,@SebastianPeredoMurga!kotlinlang Slack(获取邀请)上也有类似的线程。我在这里发布了指向原始thread()的链接和一段引语:
对我来说,这个问题是由于将框架包含在捆绑包中引起的。例如,我正在将.framework文件复制到应用程序包中。这是不必要的,因为框架是静态链接到主应用程序二进制文件的。很可能,您有一个文件夹,其中包含复制到项目中的.framework(如“外部”或“第三方”)。该文件夹不应具有任何目标的成员身份。