Mac OS 应用程序上的 Kotlin 多平台框架 CodeSign 问题

Kotlin Multi Platform framwork CodeSig problem on a Mac OS application

我使用 kotlin 多平台创建了一个模块,它是否在 Android 和 iOS 上完美运行,但是当我尝试对 macOS 应用程序我收到以下错误:

XYZ.app: code object is not signed at all
Command CodeSign failed with a nonzero exit code

我生成的框架如下:

kotlin {
    jvm("android")

    macosX64("mac") {
        binaries {
            framework {
                baseName = "XyzForMac"
            }
        }
    }

    def iosClosure = {
        binaries {
            framework {
                baseName = "XyzForIos"
            }
        }
    }
    if (System.getenv("SDK_NAME")?.startsWith("iphoneos")) {
        iosArm64("ios", iosClosure)
    } else {
        iosX64("ios", iosClosure)
    }

    sourceSets {…}
}

task packForXcode(type: Sync) {
    def targetDir = new File(buildDir, "xcode-frameworks")
    def mode = System.getenv("CONFIGURATION") ?: "DEBUG"

    def frameworkMac = kotlin.targets.getByName("mac").binaries.getFramework(mode)
    inputs.property("mode", mode)
    dependsOn frameworkMac.linkTask
    from frameworkMac.outputDirectory
    into targetDir

    def frameworkIos = kotlin.targets.getByName("ios").binaries.getFramework(mode)
    inputs.property("mode", mode)
    dependsOn frameworkIos.linkTask
    from frameworkIos.outputDirectory
    into targetDir

    doLast {
        def gradlew = new File(targetDir, "gradlew")
        gradlew.text = """\
            |#!/bin/bash
            |export 'JAVA_HOME=${System.getProperty("java.home")}'
            |cd '${rootProject.rootDir}'
            |./gradlew $@""".stripMargin().stripIndent()
        gradlew.setExecutable(true)
    }
}

tasks.getByName("build").dependsOn(packForXcode)

看起来我做的一切都是正确的,尤其是因为该应用在 Android 和 iOS 上符合预期 运行。我想知道我是否缺少任何 mac os 特定配置才能使其正常工作……

我解决了改变方法的问题,而不是使用自定义任务 packForXcode 和手动导入框架,我现在使用 CocoaPods integration,所以我做了什么:

  • 使用 cocoapods,删除 packForXcode 任务(以及 Xcode 上的自定义步骤)
  • 我正在将目标移动到 gradle build:
  • 上的特定块
  • 因为我使用的是 cocoapods,所以不再有不同的打包二进制文件了
kotlin {
    targets { // <-- this is new
        jvm("android")

        macosX64("mac") {
            binaries {
                framework("Xyz") // Removed the ForMac
            }
        }

        def iosClosure = {
            binaries {
                framework("Xyz") // Removed the ForIos
            }
        }
        if (System.getenv("SDK_NAME")?.startsWith("iphoneos")) {
            iosArm64("ios", iosClosure)
        } else {
            iosX64("ios", iosClosure)
        }
    }
    cocoapods {…} // cocoa pods block
    sourceSets {…}
}