Después de que el complemento kotlin haya recopilado para nosotros un montón de marcos diferentes para diferentes arquitecturas, creamos manualmente un nuevo marco universal en el que copiamos metadatos de cualquiera (en nuestro caso, tomamos arm64):
task copyMeta() {
    dependsOn build
    doLast {
        copy {
            from("$buildDir/bin/iphone/main/release/framework/${frameworkName}.framework")
            into "$buildDir/iphone_universal/${frameworkName}.framework"
        }
    }
}
, , , . lipo, :
task lipo(type: Exec) {
    dependsOn copyMeta
    def frameworks = files(
            "$buildDir/bin/iphone32/main/release/framework/${frameworkName}.framework/$frameworkName",
            "$buildDir/bin/iphone/main/release/framework/${frameworkName}.framework/$frameworkName",
            "$buildDir/bin/iphoneSim/main/release/framework/${frameworkName}.framework/$frameworkName"
    )
    def output = file("$buildDir/iphone_universal/${frameworkName}.framework/$frameworkName")
    inputs.files frameworks
    outputs.file output
    executable = 'lipo'
    args = frameworks.files
    args += ['-create', '-output', output]
}
, - Kotlin MPP Info.plist UIRequiredDeviceCapabilities, ( ). PlistBuddy:
task editPlistFile(type: Exec) {
    dependsOn lipo
    executable = "/bin/sh"
    def script = './scripts/edit_plist_file.sh'
    def command = "Delete :UIRequiredDeviceCapabilities"
    def file = "$buildDir/iphone_universal/${frameworkName}.framework/Info.plist"
    args += [script, command, file]
}
edit_plist_file.sh:
/usr/libexec/PlistBuddy -c "$1" "$2"
, zip ( podspec ):
task zipIosFramework(type: Zip) {
    dependsOn editPlistFile
    from "$buildDir/iphone_universal/"
    include '**/*'
    archiveName = iosArtifactName
    destinationDir(file("$buildDir/iphone_universal_zipped/"))
}
podspec :
task generatePodspecFile(type: Exec) {
    dependsOn zipIosFramework
    executable = "/bin/sh"
    def script = './scripts/generate_podspec_file.sh'
    def templateStr = "version_name"
    def sourceFile = './podspec/template.podspec'
    def replaceStr = "$version"
    args += [script, templateStr, replaceStr, sourceFile, generatedPodspecFile]
}
generate_podscpec_file.sh :
sed -e s/"$1"/"$2"/g <"$3" >"$4"
curl :
task uploadIosFrameworkToNexus(type: Exec) {
    dependsOn generatePodspecFile
    executable = "/bin/sh"
    def body = "-s -k -v --user \'$userName:$password\' " +
            "--upload-file $buildDir/iphone_universal_zipped/$iosArtifactName $iosUrlRepoPath"
    args += ['-c', "curl $body"]
}
task uploadPodspecFileToNexus(type: Exec) {
    dependsOn uploadIosFrameworkToNexus
    executable = "/bin/sh"
    def body = "-s -k -v --user \'$userName:$password\' " +
            "--upload-file $generatedPodspecFile $iosUrlRepoPath"
    args += ['-c', "curl $body"]
}
:
task createAndUploadUniversalIosFramework() {
    dependsOn uploadPodspecFileToNexus
    doLast {
        println 'createAndUploadUniversalIosFramework complete'
    }
}
Profit!