【问题标题】:How to build and sign an iOS app on separate machines?如何在不同的机器上构建和签署 iOS 应用程序?
【发布时间】:2017-06-05 15:16:09
【问题描述】:

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

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

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

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

然后可以根据我们使用的 xcconfig 将此 IPA 上传到 Hockey 或 App 商店(我们将它们交换出来以创建不同的构建)。

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

  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 文件,可能还有更多问题。

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

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

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

【问题讨论】:

  • 嗨 Dale Myers,在 xcode 七中,我使用以下命令从命令行构建 ipa 文件 xcodebuild clean build CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO -scheme helloworld clean archive -archivePath build/helloworld xcodebuild -exportArchive -exportFormat ipa -archivePath "build/helloworld.xcarchive" -exportPath "build/myipa.ipa" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO 但现在使用 xcode 9 我被困在过去两周的一些解决方案中苦苦挣扎。如果您有任何解决方案,请分享。

标签: ios xcode code-signing xcodebuild


【解决方案1】:

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

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

• 选择 Targets ('') -> Build Settings 并找到“Signing”部分。

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

  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 传输到签名机。

【讨论】:

  • 这就像做梦一样,但它不再适用于 XCode 10,因为他们删除了“不要编码符号”选项。
  • 要让这个脚本在 Xcode 10.2.1 上运行,你必须添加 CODE_SIGNING_ALLOWED=NO,所以上面的脚本变成:xcodebuild -workspace <ProjectName>.xcworkspace -scheme <ProjectName> -configuration Release clean archive -archivePath buildArchive/<ProjectName>.xcarchive CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO
【解决方案2】:

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

【讨论】:

  • 嗨 Dale Myers,您能否分享一些用于创建存档然后导出 ipa 的示例代码基于您对 xcode 9 的研究,例如xcodebuild -workspace helloworld.xcworkspace -scheme helloworld -configuration 发布干净存档 -archivePath buildArchive/helloworld.xcarchive CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO
【解决方案3】:

我认为这可能对你有用

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

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

  3. 使用签名机器上的FloatSign 脚本来退出 国际音标。

【讨论】:

  • 创建未签名的 IPA 会导致缺少权利的问题,并且 FloatSign 无法处理诸如重置权利中的调试密钥之类的事情。
猜你喜欢
  • 2021-03-20
  • 2013-02-18
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
相关资源
最近更新 更多