Dropbox API在Xcode 4.6.3中的代码签名失败:"代码对象根本没有签名"。

76

我有一个通过Mac App Store分发的OS X应用程序,最近升级到了Xcode 4.6.3。

现在,当我运行我的常规构建时,会收到以下提示:

Command /usr/bin/codesign failed with exit code 1:

/Users/Craig/Library/Developer/Xcode/DerivedData/Mac-dxcgahgplwpbjedqnembegifbowj/Build/Products/Debug/MyApp.app: code object is not signed at all
In subcomponent: /Users/Craig/Library/Developer/Xcode/DerivedData/Mac-dxcgahgplwpbjedqnembegifbowj/Build/Products/Debug/MyApp.app/Contents/Frameworks/DropboxOSX.framework
Command /usr/bin/codesign failed with exit code 1

我似乎无法发现我的项目中有任何其他变化,所以我无法确定这是否与4.6.3更新相关,还是其他问题。

我已经尝试重新启动Xcode,进行清洁构建和清洁构建文件夹。


这个问题在XCode 8.2中仍然存在。当我删除我的测试后,现在出现了这个错误:无法加载捆绑包“XXXX”,因为找不到其可执行文件。 - UKDataGeek
6个回答

140

我想我可能已经搞清楚了这个问题。我一直在使用Xcode 4.6.3进行开发,运行在OS X Mavericks上,以为任何与构建相关的工具都被捆绑在Xcode应用程序中。

但是,似乎codesign/usr/bin中。它是由Xcode安装程序之一放置在那里,还是随着原始系统安装而来,我不确定。但是,在阅读codesignman页面时,我找到了这个巧妙的选项:

--deep  When signing a bundle, specifies that nested code content such as helpers, frameworks, and plug-ins, should be recursively signed
             in turn. Beware that all signing options you specify will apply, in turn, to such nested content.
             When verifying a bundle, specifies that any nested code content will be recursively verified as to its full content. By default,
             verification of nested content is limited to a shallow investigation that may not detect changes to the nested code.
             When displaying a signature, specifies that a list of directly nested code should be written to the display output. This lists only
             code directly nested within the subject; anything nested indirectly will require recursive application of the codesign command.

之后我发现了这篇文章(https://alpha.app.net/isaiah/post/6774960),是两周前(大约在2013年6月)发布的,提到了(虽然是二手消息):

@isaiah 我问了实验室里的一个人。他说现在codesign需要先单独签署嵌入式框架,再对整个应用进行签名。

手动重新运行codesign命令(类似于Xcode通常运行的方式),并在末尾添加--deep标志,可以正确签署应用程序。

我还不确定这种手动签名会有什么影响,或者是否可以调整Xcode构建以自动添加--deep标志,但这似乎是根本问题。(codesign不再自动深度签署您的应用程序包。)


39
是的 - 我在我的Xcode项目的“构建设置”中找到了“其他代码签名标志”选项,将--deep添加进去后,现在可以成功构建。我们将看看它是否能通过Mac App Store审核。 - Craig Otis
我不相信codesign曾经进行过“深度”签名。我经常使用codesign,在包含第三方库的应用程序中,codesign仅对主要可执行文件(在Context/MacOS/中)进行签名,而其他库文件需要单独的codesign调用。 - Thomas Tempelmann
1
@ThomasTempelmann,我对codesign的了解还远远不够,无法理解到底发生了什么变化。我只知道在10.8和10.9之间(或者Xcode 4和Xcode 5之间,我同时升级了两个版本),行为确实发生了变化,这就是我成功提交应用程序的方法。 - Craig Otis
3
对于好奇的人,我已经在10.8上使用Xcode 5相当长一段时间了,但是只有今天在我尝试在10.9下签名时才遇到了这个问题。 - Rob McBroom
2
Craig Hockenberry(链接在下面的答案中)解释了为什么使用deep是错误的。 - Paul Bruneau
显示剩余4条评论

68

正如其他答案所强调的那样,代码签名方式已经发生了改变。如果您安装了任何Xcode 5 DP版本,则即使您使用Xcode 4.6.X,新工具也将被使用。

目前(在Xcode 4.6.X中),您需要做的就是按照上面建议的添加--deep标志,并将其加入到您的代码签名标志(目标,构建设置)中,如下面的图像所示。

指定内嵌框架的深度签名


3
帮了我。我想这意味着你在某种程度上为你使用的所有导入库背书。 - Tom Andersen
根据上面我的回答所得到的评论,似乎这个问题实际上是特定于OS 10.9而不是Xcode 5。 - Craig Otis
3
苹果公司的技术文档2206号声明:“虽然--deep选项可应用于签名操作,但不建议这样做。我们建议您按照个别阶段从内到外对代码进行签名(就像Xcode自动执行的那样)。使用--deep选项仅用于紧急修复和临时调整。” - Elise van Looij

13

对于我来说,这个问题是在拖动一个名为“资源”的文件夹到我的项目后引起的。将其更名为其他任何名称(例如“resourcessss”),错误消息就消失了。


这是我的问题。还要注意通常的Mac文件系统不区分大小写,所以如果您有一个名为“Resources”或“RESOURCES”的文件夹或文件,它也会导致此问题。 - Kevin
这也解决了我的问题。唯一剩下的事情就是从应用程序包中删除“Resource”文件夹并重新启动Xcode.app。 - sensation
我遇到了一些问题,但这个答案帮助了我。我发现我有一个名为 Resources 的蓝色文件夹和一个名为 Resources 的黄色文件夹。我还发现它抱怨的文件只在其中一个文件夹中。最后,我完全删除了蓝色文件夹(引用而不是文件,这两个文件夹中的文件是相同的),并将其重命名为 Res。我不是完全确定是否必要(在删除蓝色文件夹之前我已经这样做了),因为我有另一个项目,其中有一个名为 Resources 的黄色文件夹,在那里没有任何问题。 - Andy Weinstein
这对我也起作用了。我想在这个页面上添加一个关键字。我的问题是与nativescript有关的,所以不是真正的x-code /纯ios开发。希望这也能帮助其他人。 - David Brown
对于未来的读者,如果你需要包含一个名为“Resources”的文件夹(就像我一样),你所要做的就是,在添加到项目时,选择“创建组”而不是“创建文件夹引用”,这样就不会出现这个错误。(只需确保在此之后仍然设置了所述文件的目标成员身份) - Albert Renshaw

4
我遇到了同样的问题,但答案很简单:我的应用程序上的代码签名标识设置为“ - ”,所以将其设置为“不进行代码签名”即可解决问题。
“ - ”似乎是执行某些操作时的默认设置,尽管我无法告诉您那些操作是什么。

1
这个解决方案适用于在模拟器上运行应用程序,但当我们想要制作ipa或存档时,从我的角度来看,这个解决方案将无法使用。 - Bhavsang Jam

2
这可能对某些人有帮助:
我通过反复试错终于找到了解决方案。在我的情况下,我的文件夹名称与构建设置下的“产品名称”变量匹配。这也与整个项目名称匹配!因此,我只是更改了一个字段。“构建设置” -> “产品名称”。MySpecialApp的值更改为My-SpecialApp。那就是这样!然后,我重新登录Apple开发者门户,并为开发和分发创建了新的应用程序ID和移动配置文件,其余的就是历史了。当通过Ad Hoc分发部署时,我的发布现在可以正常工作。
最后一点要注意的是,这肯定是一个错误,Apple应该提醒用户他们做错了什么,并启用某种自动纠正操作。
-更多内容请参见:http://www.chrisdanielson.com/2012/08/29/codesign-ipa-and-the-code-object-is-not-signed-at-all-problem/#sthash.F0nF3BbC.dpuf

1
感谢@VBB的回复,但不幸的是,这个产品名称在过去几年中没有改变。(而且我现在也不能更改它。) - Craig Otis

0
对我来说,问题出在 PaddleMAs 框架损坏了,解决方法如下: 1. 从我的 Cocoapods 文件中删除该框架; 2. 运行 pod install; 3. 重新启动 Xcode。
这样就可以解决问题了。不幸的是,损坏的框架会防止其签名,但 XCode 并没有清晰地显示这个错误并给您一个好的修复建议。我已向 Apple 提出了一个错误报告,希望他们能解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接