After the kotlin plugin has collected for us a bunch of different frameworks for different architectures, we manually create a new universal framework into which we copy meta data from any (in our case, we took 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!