【发布时间】: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 商店(我们将它们交换出来以创建不同的构建)。
我们现在要确保我们的证书尽可能安全。这意味着我们想在一台机器上执行构建,但在另一台机器上进行签名。为此,我们需要这样做:
- 创建一个未签名的 xcarchive
- 将 xcarchive 传输到签名机
- 将 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