iOS 正在使用应用商店证书签署企业 IPA

iOS Resigning enterprise IPA with app-store certificate

我需要找到一种方法让黑盒辞职再次工作,最好不需要在辞职期间被替换的虚拟 AppStore 分发证书。

背景说明:

我们有一个设置,其中另一个部门有一个辞职工作,可以接收 IPA 并使用他们自己的证书和配置文件辞职,并设置适当的包标识符。

此辞职作业的输入 .ipa 文件之前是使用 app-store 导出方法以及另一个 AppStore 分发证书和相应的配置文件构建的。这使得可以毫无问题地上传输出 .ipa 文件。

当辞职替换证书、配置文件和捆绑包标识符时,是否有可能为 enterprise 导出方法构建并辞职如果他们被替换了呢?

尝试此操作会在将重新注册的 .ipa 文件上传到 AppStore 时出错。

ITMS-90426: Invalid Swift Support - The SwiftSupport folder is missing. Rebuild your app using the current public (GM) version of Xcode and resubmit it.

我猜这是由于导出方法的原因,因为构建配置的其余部分是相同的(尽管使用了适当的证书和配置文件) 尝试使用企业证书进行初始签名的原因是输入的开发人员程序应该被淘汰。

当您的二进制文件缺少 swift 支持文件夹时会出现此错误。我在尝试为 iOS 构建 chromium 应用程序时遇到了同样的错误。解决方案并不容易,您需要自己嵌入文件夹。首先,您需要检查您在第三方中使用了哪些 swift 库,例如 libxswiftCore.dylib

Create folder With name SwiftSupport 在该文件夹下创建 iphoneos 文件夹,将所有需要的 dylib 文件放入此文件夹,确保这些dylib 文件应该由全球苹果证书签名,而不是您自己的证书。之后再创建一个文件夹 Payload 并将您的 .app 文件放入其中。确保 SwiftSupport 和 Payload 应该在同一个层次结构中。确保您的 zip 不应包含 .DS_Store 文件,删除这些文件。我为这项工作创建了一个脚本,但那家公司 属性,如果这仍然不适合您,请告诉我。或者你可以给我写一封电子邮件。 mshauket.developer@gmail.com

我创建了一个脚本,用于将 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

用法:

  1. 将脚本复制到文本编辑器中并保存,不带扩展名
  2. 像这样使其可执行:chmod +x path/to/script
  3. 运行 从终端通过以下两种方式之一:
  • 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 中分发时没有任何负面影响。