为什么复制嵌入式框架头的Xcode行为会因目标而异?

时间:2015-03-26 09:47:31

标签: xcode cocoa build frameworks

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

Installation problem

好的,让我们用RB App Checker Lite.

进行检查

Validation result

有趣。这个目标缺少一些资源,让我们称之为Example 2.为了确定,我检查了另一个目标Example 1,并且没有任何验证问题。

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

我还检查了磁盘上的捆绑包。果然,标题在示例1中,但不在示例2中。

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

示例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,这些参数导致不包含标题。

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

我已经一遍又一遍地审查了目标的构建设置,并且看起来和我一样相同。我似乎没有办法影响builtin-copy的行为。但显然,有些事情正在影响它。

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

我的Xcode版本是6.1.1(6A2008a),这是App Store当前提供的版本。

1 个答案:

答案 0 :(得分:2)

Xcode对于它决定向您展示的内容非常挑剔,因此在调查此类问题时,第一步是手动查看project.pbxproj文件 。 / p>

打开Example 1.xcodeproj/project.pbxproj并导航到复制框架的指令(我搜索“复制框架文件”),你会看到类似的东西:

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

Example 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设置。

不幸的是,这并没有在UI中反映出来。似乎Xcode的某些版本只会添加它(我怀疑它与Code Sign复选框有关,但我无法重现任何值得一提的东西)。