xcode - 为什么复制嵌入式框架 header 的 Xcode 行为在不同目标上有所不同?

标签 xcode cocoa build frameworks

我正在开发一个有两个构建目标的 Mac 项目。我的一位用户报告无法安装其中一个目标。

Installation problem

好的,我们用 RB App Checker Lite. 来检查一下

Validation result

有趣。此目标缺少一些资源,我们将其称为示例 2。为了确定,我检查了另一个目标,示例 1,该目标没有任何验证问题。

因此目标是不同的,因为它涉及复制 HockeySDK/CrashReporter 框架中嵌入的 header 。代码签名期望这些 header 存在,但它们不存在,并且签名验证失败。

我还检查了磁盘上的 bundle 。果然,示例 1 中有 header ,但示例 2 中没有。

我的下一个问题是,为什么目标的构建方式不同?为什么示例 1 包含 header 而示例 2 不包含 header ?我查看了目标的构建日志,果然,“复制框架”阶段存在差异。

示例1日志:

PBXCp Libraries/HockeySDK-Mac/HockeySDK.framework /Users/jaanus/Library/Developer/Xcode/DerivedData/Example-chptxdrwwlafgodccbiqclccqjkl/Build/Intermediates/ArchiveIntermediates/Example\ 1/InstallationBuildProductsLocation/Applications/Example\ 1.app/Contents/Frameworks/HockeySDK.framework
    cd /Users/jaanus/dev/Example/tool
    builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git\
    -exclude .hg -resolve-src-symlinks /Users/jaanus/dev/Example/tool/Libraries/HockeySDK-Mac/HockeySDK.framework /Users/jaanus/Library/Developer/Xcode/DerivedData/Example-chptxdrwwlafgodccbiqclccqjkl/Build/Intermediates/ArchiveIntermediates/Example\ 1/InstallationBuildProductsLocation/Applications/Example\ 1.app/Contents/Frameworks

示例2日志:

PBXCp Libraries/HockeySDK-Mac/HockeySDK.framework /Users/jaanus/Library/Developer/Xcode/DerivedData/Example-chptxdrwwlafgodccbiqclccqjkl/Build/Intermediates/ArchiveIntermediates/Example\ 2/InstallationBuildProductsLocation/Applications/Example\ 2.app/Contents/Frameworks/HockeySDK.framework
    cd /Users/jaanus/dev/Example/tool
    builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git\
    -exclude .hg -exclude Headers -exclude PrivateHeaders -resolve-src-symlinks /Users/jaanus/dev/Example/tool/Libraries/HockeySDK-Mac/HockeySDK.framework /Users/jaanus/Library/Developer/Xcode/DerivedData/Example-chptxdrwwlafgodccbiqclccqjkl/Build/Intermediates/ArchiveIntermediates/Example\ 2/InstallationBuildProductsLocation/Applications/Example\ 2.app/Contents/Frameworks

果然,示例 2 builtin-copy 命令包含额外的参数 -exclude Headers -exclude PrivateHeaders ,这会导致 header 不被包含在内。

现在的问题是,为什么构建一个目标会排除 header ,而另一个目标则不会?

我一遍又一遍地检查了目标的build设置,并且外观对我来说尽可能相同。我似乎没有办法影响 builtin-copy 的行为。但显然,有一些东西正在影响它。

我现在使用一个我不喜欢的丑陋的解决方法修复了它。我真的很想了解这里发生了什么以及如何解决这个问题。

我的 Xcode 版本是 6.1.1 (6A2008a),目前可以从 App Store 获取。

最佳答案

Xcode 对于决定向您显示的内容非常有选择性,因此在调查此类问题时,第一步是手动查看 project.pbxproj 文件.

打开示例 1.xcodeproj/project.pbxproj 并导航到复制框架的指令(我搜索“复制框架文件”),您将看到类似以下内容的内容:

BCAC434BC9F0E2F78087CA01 /* HockeySDK.framework in Copy Framework Files */ = {isa = PBXBuildFile; fileRef = BCAC434BC9F0E2F78087CA01 /* HockeySDK.framework */; };

以及示例 2.xcodeproj/project.pbxproj 中的类似内容:

F19543FC17EC99FB62CA62C8 /* HockeySDK.framework in Copy Framework Files */ = {isa = PBXBuildFile; fileRef = F19543FC17EC99FB62CA62C8 /* HockeySDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };

从这里开始,一切就很清楚了。示例2的复制指令后面有一些附加设置:

settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); };

因此,要“修复”该问题,您只需根据需要添加或删除 RemoveHeadersOnCopy 设置即可。

不幸的是,这并没有反射(reflect)在用户界面中。似乎某些版本的 Xcode 只会添加它(我怀疑它与 Code Sign 复选框有关,但我无法重现任何值得一提的内容)。

关于xcode - 为什么复制嵌入式框架 header 的 Xcode 行为在不同目标上有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29275293/

相关文章:

xcode - Xcode v 6.3.2 中的错误消息

objective-c - NSOutlineView 和 NSCell (NSTextFieldCell) 上的自定义选择

flutter - InterfaceType 不是 VariableGet 中 Class 的子类型

xcode - 错误 : pathspec did not match any file(s) known to git

objective-c - Leaks Instrument 是否能发现所有泄漏?

macos - Cocoa 文件选择对话框允许的文件类型

android - 如何使用不同的 Java 代码构建不同风格的 apk?

build - GitHub 上的 Jenkins 工作状态

ios - 当我收到 SDK 的这条消息 : <Google:HTML> You are currently using version 7. 6.0 时,如何在 Xcode 中升级 Google 移动广告 SDK?

cocoa - 获取具有特定属性的 nsattributed 字符串的子字符串