我需要找到一种方法来使黑盒辞职再次工作,最好不需要在辞职期间替换的虚拟AppStore分发证书。
背景说明:
我们有一个设置,其中另一个部门有一个辞职作业,该作业可以接收 IPA,并使用自己的证书和预配配置文件对其进行签名,并设置适当的捆绑标识符。
此重新签名作业的输入 .ipa 文件以前是使用应用商店导出方法构建的,其中包含另一个 AppStore 分发证书和相应的预配配置文件。这使得上传输出 .ipa 文件可以毫无问题。
在进行辞职时,替换证书、预配配置文件和捆绑标识符是否可以为企业导出方法构建,并在替换它们时辞职?
尝试此操作会在将已签名的 .ipa 文件上传到亚马逊应用商店时出错。
ITMS-90426:无效的 Swift 支持 - 缺少 SwiftSupport 文件夹。使用当前公共 (GM) 版本的 Xcode 重新构建您的 app,然后重新提交。
我想这是由于导出方法,因为构建配置的其余部分是相同的(尽管使用了适当的证书和配置文件) 尝试使用企业证书进行初始签名的原因是,输入开发人员程序应分阶段进行。
我创建了一个脚本,该脚本将SwiftSupport
文件夹添加到缺少它的.ipa
(即为企业发行版生成的文件夹):
#!/bin/bash
for ARGUMENT in "$@"
do
KEY=$(echo $ARGUMENT | cut -f1 -d=)
VALUE=$(echo $ARGUMENT | cut -f2 -d=)
case "$KEY" in
ipa_path) ipaPath=${VALUE} ;; # Format: "Path/to/app.ipa"
archive_path) archivePath=${VALUE} ;; # Format: "Path/to/app.xcarchive"
toolchain_path) toolchainPath=${VALUE} ;; # Format: "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/iphoneos"
*)
esac
done
# Derived Variables
ipaDirectory=$(dirname "$ipaPath")
ipaName=$(basename "$ipaPath")
zipName=${ipaName/.ipa/.zip}
appName=${ipaName/.ipa/}
zipSuffix=-unzipped
unzippedDirectoryName=${appName}${zipSuffix}
newIpaSuffix=-with-swift-support
newIpaName=${appName}${newIpaSuffix}
swiftSupportPath=SwiftSupport/iphoneos
ipaSwiftSupportDirectory=${ipaDirectory}/${unzippedDirectoryName}/${swiftSupportPath}
# Changes the .ipa file extension to .zip and unzips it
function unzipIPA {
mv "${ipaDirectory}/${ipaName}" "${ipaDirectory}/${zipName}"
unzip "${ipaDirectory}/${zipName}" -d "${ipaDirectory}/${unzippedDirectoryName}"
}
# Copies the SwiftSupport folder from the .xcarchive into the .ipa
function copySwiftSupportFromArchiveIntoIPA {
mkdir -p "$ipaSwiftSupportDirectory"
cd "${archivePath}/${swiftSupportPath}"
for file in *.dylib; do
cp "$file" "$ipaSwiftSupportDirectory"
done
}
# Creates the SwiftSupport folder from the Xcode toolchain and copies it into the .ipa
function copySwiftSupportFromToolchainIntoIPA {
mkdir -p "$ipaSwiftSupportDirectory"
cd "${ipaDirectory}/${unzippedDirectoryName}/Payload/${appName}.app/Frameworks"
for file in *.dylib; do
cp "${toolchainPath}/${file}" "$ipaSwiftSupportDirectory"
done
}
# Adds the SwiftSupport folder from one of two sources depending on the presence of an .xcarchive
function addSwiftSupportFolder {
if [ -z "$archivePath" ]
then
copySwiftSupportFromToolchainIntoIPA
else
copySwiftSupportFromArchiveIntoIPA
fi
}
# Zips the new folder back up and changes the extension to .ipa
function createAppStoreIPA {
cd "${ipaDirectory}/${unzippedDirectoryName}"
zip -r "${ipaDirectory}/${newIpaName}.zip" ./*
mv "${ipaDirectory}/${newIpaName}.zip" "${ipaDirectory}/${newIpaName}.ipa"
}
# Renames original .ipa and deletes the unzipped folder
function cleanUp {
mv "${ipaDirectory}/${zipName}" "${ipaDirectory}/${ipaName}"
rm -r "${ipaDirectory}/${unzippedDirectoryName}"
}
# Execute Steps
unzipIPA
addSwiftSupportFolder
createAppStoreIPA
cleanUp
它也可以作为要点使用:https://gist.github.com/adamzarn/6bb89d91ed4b8c3d3fb25363c221441f
用法:
- 将脚本复制到文本编辑器中,并在不带扩展名的情况下保存
- 使其可执行,如下所示:
chmod +x path/to/script
- 通过以下两种方式之一从终端运行它:
path/to/script ipa_path="path/to/ipa" archive_path="path/to/xcarchive"
path/to/script ipa_path="path/to/ipa" toolchain_path="path/to/toolchain"
如果您有权访问生成.ipa
的.xcarchive
,则脚本将从那里获取SwiftSupport
文件夹。否则,它将通过查看.app
文件来确定需要哪些.dylib
文件,然后从 Xcode 工具链生成一个SwiftSupport
文件夹。
如果您使用的是 Xcode 工具链,请确保提供的路径包含.dylib
文件列表。下面是一个示例路径:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/iphoneos
对于 Xcode 10,路径包含一个swift
文件夹,但对于 Xcode 11,必须使用swift-5.0
。
我已经对此进行了测试,它成功解决了Apple提出的无效Swift支持错误,在App Store中分发时没有任何负面副作用。
当您的二进制文件缺少 swift 支持文件夹时,会出现此错误。当我尝试为 iOS 构建铬应用程序时,我遇到了同样的错误。解决方案并不容易,您需要自己嵌入文件夹。首先,您需要检查您在第三方(如libxswiftCore.dylib)中使用了哪些swift库
。创建文件夹 名称为 SwiftSupport 在该文件夹下创建iphoneOS文件夹,将所有必需的 dylib 文件放在此文件夹中,确保这些 dylib 文件应由全球 Apple 证书签名,而不是您自己的证书。 之后再创建一个文件夹 Payload 并将您的.app文件放入其中。 确保SwiftSupport和 Payload 应位于同一层次结构中。 确保您的 zip 不应包含.DS_Store文件, 删除这些文件。我为这项工作创建了一个脚本,但该公司财产,如果这仍然不适合您,请告诉我。或者你可以给我写一封电子邮件。mshauket.developer@gmail.com