Ios Kotlin多平台-错误ITMS-90171:包结构无效
我在Apple app Store上尝试使用Kotlin Multiplatform分发iOS应用程序时遇到问题: 错误ITMS-90171:“无效的捆绑包结构-不允许使用二进制文件'Smiledu_app.app/Frameworks/shared.framework/shared'。您的应用程序不能包含独立的可执行文件或库,只能包含有效的CbundleExecutable受支持的捆绑包。有关iOS应用程序捆绑包结构的信息,请参阅的捆绑包编程指南。” 我检查了它在构建阶段->复制捆绑资源中是否不存在 这是我的身材。gradle.ktsIos 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应用程序捆绑包结构的信息,请参阅的捆绑包编程指南。” 我检查了它在构建阶段->复制捆绑资源
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(如“外部”或“第三方”)。该文件夹不应具有任何目标的成员身份。