如何在不同的机器上构建和签署iOS应用程序?

我们有一个iOS应用程序,它是使用Jenkins运行的一系列Bash脚本构建的。 就像今天的情况一样,我们使用以下命令构建一个xcarchive:

xcodebuild archive -workspace "..." -scheme "..." -configuration "Release" -archivePath "..." 

这将构建应用程序,并使用配置文件中指定的证书对其进行签名,该配置文件是使用xcconfig设置的。 完成后,我们将使用以下内容将其转换为IPA:

 xcodebuild -archivePath "..." -exportArchive -exportOptionsPlist "${export_options_plist}" -exportPath "..." 

然后可以将此IPA上传到Hockey或App Store,具体取决于我们使用的xcconfig(我们将它们交换出来以创建不同的版本)。

我们现在要确保我们的证书尽可能安全。 这意味着我们希望在一台机器上执行构建,而在另一台机器上执行签名。 为此,我们需要这样做:

  1. 创建一个未签名的xcarchive
  2. 将xcarchive传输到签名计算机
  3. 将xcarchive变为签名的IPA

现在可以忽略第2步,所以我们只关注步骤#1和#3。

可以通过向archive命令添加参数CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO来创建无符号的xcarchive。

签署IPA要困难得多。 我们假设我们可以再次创建IPA并使用codesign命令在IPA中签署二进制文件。 这有几个问题。 首先,我们为应用程序提供的.entitlements文件没有得到尊重。 我们必须将此作为标志传递给签名命令。 然后我们意识到我们必须更正.entitlements文件中的所有变量,因为Xcode不再用正确的值替换它们。 然后我们意识到我们必须为每个扩展做到这一点。

我们最终得到了这一切,正确的权利,替换变量和所有签名,但当我尝试将新签名的IPA上传到曲棍球时,它拒绝了它。 错误消息也没有帮助。

我们使用新系统对先前系统进行了构建,并且每个二进制文件都不同。 我们不确定这是一个代码签名问题,还是只是一个时间戳更改,但是有变化。 此外,我们发现我的扩展程序都缺少archived-expanded-entitlements.xcent文件,还有更多问题。

看起来我们似乎错误地采取了这种做法。 我们显然不应该只是为了在不同的机器上签名而重新做所有事情,那么我们哪里出错? 我们如何在一台机器上构建并在另一台机器上签名?

PS我们当前的工具直接使用xcodebuild ,但我们支持fastlane用于构建过程的其他部分,因此我们很乐意在需要时使用它。

更新:我们有一个“解决方案”,即使用开发证书对Release版本进行签名,然后使用分发版本对其进行重新签名。 这解决了权利被填充等所有问题,但仍然要求每个二进制文件被重新签名和权利组合等等所以我很好奇是否有更好的解决方案。

我们与公司的其他团队一起工作了几个星期。 我们所有人都得出了相同的结论,没有比使用开发证书签名更好的选择,然后用prod证书重新签署每个二进制文件。 这不是一个直接的过程,但这就是我们留下的。

请按照步骤创建未签名的xcarchive

  1. 设置’代码签名身份’=’不代码签名’

•选择目标(”) – >构建设置,然后找到“签名”部分。

设置’代码签名身份’=’不代码签名’

在此处输入图像描述

  1. 设置Bundle Identifier =”

设置版本= 1.0 //您需要发送

设置Build = 5 //你需要发送

删除’自动管理唱歌’标志。

在此处输入图像描述

  1. 打开终端并转到项目根文件夹。 然后运行以下命令。

xcodebuild -workspace .xcworkspace -scheme -configuration Release clean archive -archivePath buildArchive/.xcarchive CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO

  1. 成功完成后,它将创建一个新的“buildArchive”文件夹,并在其中创建一个“.xcarchive”文件。

您可以压缩“.xcarchive”文件并将xcarchive传输到签名计算机。

我认为这对你有用

  1. 在构建计算机上创建未签名的IPA。

  2. 在构建计算机中有一个脚本,用于将IPA传输到您的签名计算机。

  3. 使用签名计算机上的FloatSign脚本重新签名IPA。