在我们的环境中,我们跨多个项目和平台共享资源。为 iPhone 进行构建时,仅需要这些资源的子集。由于该子集仍然相当大,因此我们有一个清单文件列出了其中的内容,这限制了副本。我们有自己的 Python 脚本来执行复制,仅刷新已更改的文件。
我已经在 Xcode 中创建了一个运行脚本阶段来调用该脚本,但我遇到了一些与代码签名阶段相关的问题。
由于我们使用单独的清单文件,因此我的运行脚本阶段无法在 Xcode GUI 中指定任何输入/输出文件:它根据当时目录中包含的内容而变化。这样做的副作用是 Xcode 并不严格知道哪些文件将被复制(可以说,事情发生在“幕后”)。
我遇到的问题是,如果我只在构建之间修改资源文件,重建我的应用程序将正确调用我的脚本,该脚本复制相应的文件,只有 Xcode 不会重新运行代码签名步骤,并且不会重新复制我的应用程序到我的设备。
我发现这很奇怪,考虑到我的资源文件确实列在<app_bundle>/_CodeSignature/CodeResources
文件,但看起来 Xcode 确定独立于该文件的重建要求(可能只有项目文件中列出的文件),这是可以理解的。
我尝试通过触摸应用程序包的目录或应用程序的二进制文件本身来玩弄花招,但它不太有效。触摸应用程序的包目录似乎没有做任何事情,而触摸二进制文件将起作用,但不适用于当前构建,仅适用于后续构建(因为没有输入文件需要重新编译,Xcode 推断不会生成新的二进制文件,但下一个构建会起作用)时间,它确实会检测到二进制文件已被触及,并重做代码签名和开启)。
尽管如此,这仍然是一个相当不完美的解决方法,因为:
- 必须构建两次很容易出错
- 我的 dSYM 文件将不必要地重新生成
有谁知道有什么方法可以在 Xcode 中强制执行代码签名步骤(从运行脚本或其他地方)?
您可以直接从命令行或 shell 脚本调用 codesign,例如
codesign -f -s "iPhone Distribution" --entitlements Entitlements.xcent -vv location/MyApp.app/MyApp
Run man codesign
以了解其用法。
您可以通过查看 Xcode 中的详细构建输出来发现运行的所有内部命令。选择“构建”选项卡,然后单击该窗格左下角的小图标 - 看起来像文本的图标(位于警告图标旁边)。这将在 Xcode 的新窗格中显示完整的构建输出。
我创建了一个直接调用 codesign 的 shell 脚本,这样我就可以使用新的证书和配置文件重新签署现有的二进制文件(例如,在更新二进制文件中的一些图形之后)。
事实证明这非常复杂,因为 Xcode 在其内部构建过程中做了一些微妙的事情(一个例子:Xcode 将配置文件嵌入到生成的应用程序二进制文件中,但在此过程中更改了它的一些值,例如 get-task - 允许设置)。这意味着我必须编写一个工具来从配置文件中生成适当的 .xcent 文件,具体取决于是否正在完成开发/分发/应用商店构建。希望这些都不会影响你......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)