在Xcode中强制进行代码签名刷新

时间:2009-11-06 17:18:51

标签: iphone xcode

在我们的环境中,我们在多个项目和平台之间共享资源。在为iPhone构建时,只需要这些资源的一部分。由于该子集仍然很大,我们有一个清单文件列出了进入的内容,这限制了副本。我们有自己的Python脚本来执行复制,只刷新已更改的文件。

我在Xcode中创建了一个Run Script Phase来调用该脚本,但是我遇到了一些与Code Signing阶段相关的问题。

由于我们使用单独的清单文件,因此我的运行脚本阶段无法在Xcode GUI中指定任何输入/输出文件:它根据当时目录中包含的内容而有所不同。这样做的副作用是Xcode并不严格知道会复制哪些文件(事情就是“在封面下”,可以这么说)。

我遇到的问题是,如果我只在构建之间修改资源文件,重建我的应用程序将正确调用我的脚本,该脚本会复制相应的文件,只有Xcode不会重新运行代码签名步骤,并且不会重新执行将我的应用程序复制到我的设备上。

我发现这很奇怪,考虑到我的资源文件确实列在<app_bundle>/_CodeSignature/CodeResources文件中,但看起来Xcode决定了独立于此的重建要求(可能只是项目文件中列出的文件),这是可以理解的

我尝试通过触摸我的应用程序包的目录或应用程序的二进制文件本身来玩技巧,但它不太有用。触摸应用程序的捆绑目录似乎没有做任何事情,而触摸二进制文件将起作用,但不是当前构建,只有后续的(因为没有输入文件需要重新编译,Xcode推断没有生成新的二进制文件,但下一个时间,它确实会检测到二进制文件已被触摸,并重做代码签名和()。)

但是,这是一个非常不完美的解决方法,因为:

  • 必须构建两次才容易出错
  • 我的dSYM文件将不必要地重新生成

有没有人知道在Xcode中强制执行代码签名步骤的任何方法(从运行脚本或其他地方)?

1 个答案:

答案 0 :(得分:0)

您可以直接从命令行或shell脚本调用codesign,例如

codesign -f -s "iPhone Distribution" --entitlements Entitlements.xcent -vv location/MyApp.app/MyApp

运行man codesign以了解使用情况。

您可以通过查看Xcode中的详细构建输出来发现所有内部命令。选择Build选项卡,然后单击该窗口窗格左下角的小图标 - 看起来像文本的图标(它位于警告图标旁边)。这将在Xcode的新窗格中显示完整的构建输出。

我创建了一个直接调用codesign的shell脚本,因此我可以使用新的证书和配置文件重新签名现有的二进制文件(例如,在更新二进制文件中的某些图形之后)。

事实证明这非常复杂,因为Xcode在内部构建过程中做了一些微妙的事情(一个例子:Xcode将配置文件嵌入到生成的应用程序二进制文件中,但在此过程中会更改其某些值,例如get-task-allow设置)。这意味着我必须编写一个工具来从配置文件生成适当的.xcent文件,具体取决于是否正在进行开发/分发/ App Store构建。希望这些都不会影响你......