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

How to build and sign an iOS app on separate machines?

我们有一个 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 步。

可以通过将参数 CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO 添加到 archive 命令来创建未签名的 xcarchive。

虽然签署 IPA 要棘手得多。我们假设我们可以再次创建 IPA 并使用 codesign 命令对 IPA 中的二进制文件进行签名。但这有几个问题。首先是我们为应用程序准备的 .entitlements 文件没有得到遵守。我们必须将其作为标志传递给签名命令。然后我们意识到我们必须更正 .entitlements 文件中的所有变量,因为 Xcode 不再用正确的值替换它们。然后我们意识到我们必须为我们拥有的每个扩展执行此操作。

我们终于让这一切正常工作,使用正确的权利,替换变量并且一切都已签名,但是当我尝试将新签名的 IPA 上传到 Hockey 时,它拒绝了它。错误消息也没有帮助。

我们将旧系统的构建与新​​系统进行了差异化,每个二进制文件都不同。我们不确定这是一个代码设计问题,还是仅仅是时间戳的变化,但确实有变化。此外,我们发现我的扩展都缺少 archived-expanded-entitlements.xcent 个文件,而且可能还有更多问题。

看来我们的处理方式肯定是错误的。我们显然不应该为了在不同的机器上签名而重新做所有事情,那么我们哪里出错了?我们应该如何在一台机器上构建并在另一台机器上签名?

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

更新:我们对此有一个 "solution",这是使用开发证书签署发布版本,然后使用分发证书将其退出。这解决了权利被填充等所有问题,但仍然需要每个二进制文件被辞职和权利合并等,所以我很好奇是否有更好的解决方案。

我想这可能对你有用

  1. 在您的构建机器上创建一个未签名的 IPA。

  2. 构建机器中有一个脚本可以将 IPA 传输到您的 签名机.

  3. 在签名机上使用FloatSign脚本进行签名 国际音标.

我们与公司的其他团队一起为此工作了数周。我们所有人都得出了相同的结论,没有比使用开发证书签名然后使用产品证书重新签名每个二进制文件更好的选择了。这不是一个直截了当的过程,但这就是我们所剩下的。

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

  1. 设置“代码签名身份”=“不要代码签名”

• Select 目标 ('') -> 构建设置并找到“签名”部分。

设置“代码签名身份”=“不代码签名”

  1. 设置捆绑包标识符 = ‘’

Set Version = 1.0 //即你需要发送

Set Build = 5 //你需要发送

移除“自动管理歌唱”标志。

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

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

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

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