可执行文件使用了无效的授权签名。

72

我在 iPhone 上进行 ad-hoc 分发时遇到了问题。我的应用程序使用 SDK 3.0 进行开发,并且我拥有开发者许可证,已经将相关的证书和配置文件添加到了我的项目中,所以这方面没有问题。

但是,当我试图安装该应用程序时,它会编译项目,然后在 Organizer 窗口中显示错误:"The executable was signed with invalid entitlements"。我是否漏掉了什么?我已经从2.2.1升级了我的 iPhone,并下载了最新的 Apple SDK。

请帮我解决这个问题。

19个回答

52

'Portal Program' 中有非常好的说明。如果您登录

http://developer.apple.com/iphone

然后在左侧单击 "Distribution",并单击底部的

"创建和下载用于自定义分发的分发配置文件"

链接。

以下是关键步骤:

对于自定义分发,请完成以下操作:

  • 在 "文件" 菜单中,选择新建文件-> iPhone OS -> Code Signing -> Entitlements。 将文件命名为“Entitlements.plist”,然后单击 “完成”。这会在项目中创建默认授权文件的副本。
  • 选择新的 Entitlments.plist 文件,并取消选中“get-task-allow”属性。保存 Entitlements.plist 文件。(在 Xcode 4 中,“ get-task-allow”称为“Can be debugged”)
  • 选择目标并打开生成设置检查器。在 'Code Signing Entitlements' 生成设置中,键入新 Entitlements.plist 文件的文件名,包括扩展名。除非您将 Entitlements.plist 文件放在项目顶层之外的其他位置,否则无需指定路径。
  • 单击 '生成'。(注意:您的二进制文件必须包含一个平铺的、正方形的图像图标,大小为57x57像素。该图标显示在iPhone或iPod touch主屏幕上。)

1
我正想写同样的事情,很容易忘记除了存储构建之外,你还需要get-tak-allow来进行即席构建! - Kendall Helmstetter Gelner
这对我没有用 - 它导致了相同的“无效的授权”错误。但是根据下面的一些评论,我清除了所有内容,然后选中(而不是取消选中)了“get-task-allow”,然后再次尝试 - 这次它起作用了。 - Joe Strout
我在更新自 git-hub 的一个旧项目时遇到了同样的问题,检查该属性(我记得以前未设置)似乎也解决了我的问题。奇怪。 - TimM
2
哇,这刚刚为我节省了大约12个小时的头痛。谢谢。 - JayCrossler
3
谢谢你,令人惊讶的是这些信息在苹果官网上很难找到,似乎 Stack Overflow 是一个更好的资源。 - KevinDTimm
@KevinDTimm实际上,这并不令人惊讶。文档使用锚点非常糟糕,因此很难通过URI引用。这就是为什么你会在SO上看到那么多关于配置和IOS的帖子,描述了如何转到URI,然后“点击这里,点击那里,点击任何地方”。我期待有一天苹果的文档不再是一个封闭的花园。 - David Watson

34

如果您试图对未在预配配置文件中包括的设备进行剖析,则可能会发生此错误。

请确保您的设备包含在您要使用的开发预配配置文件中。某种程度上,错误消息是具有误导性的。我的资格证书实际上是没问题的。


14

我发现在开发构建时需要检查"get-task-allow",但在发布构建时不需要。最简单的方法(据我所知)是在项目中拥有两个授权文件:Entitlements.plist和EntitlementsDebug.plist - 并在项目的各种配置的构建项目设置中引用正确的授权文件。


10
我从未需要做这件事。对于你的开发构建配置,只需确保代码签名权益为空即可。 - Ben Scheirman
2
获取任务允许未经检查对我奏效了... 这个难缠的小家伙。 - WrightsCS
我也不得不检查get-task-allow以在我的设备上获得开发版本。 - memmons

6

5
如果您遇到这种情况,似乎需要检查“get-task-allow”以便将调试(!)版本部署到手机上,请按照以下步骤操作:
a)检查构建设置。在“Code Signing Entitlements”中,Debug部分不应该有任何条目。 b)暂时删除Entitlements.plist并构建您的调试版本。如果它抱怨缺少Entitlements.plist,则可能有与我今天要解决的相同情况。 c)再次使用Entitlements.plist进行构建,并启用“get-task-allow”。如果现在可以正常工作,则您可能有相同的问题。
在尝试使用新配置文件进行折腾后,我无法将我的调试版本部署到手机上。AdHoc没问题。我检查了a) - 空白..嗯。我检查了b) - 有问题。c) - 可以工作...
最后,我在编辑器中检查了project.pbjproj,并且尽管GUI声称Debug部分没有“Code Signing Entitlements”的条目,但实际上确实存在一个。我清空了它,问题解决了。

这对我有用。在我为AdHoc添加Entitlements.plist后,xcode将该要求复制到我的Debug和Release目标中(尽管我没有在Build选项卡中输入)。手动从pbxproj文件中删除后,Debug构建再次正常工作。 - thrusty

4
这是因为您运行应用程序的设备没有与您的配置文件进行匹配。所以,请浏览 证书、标识符和配置文件 选择您的 iOS 配置文件,然后点击编辑并选择您的设备。

enter image description here


3
我刚刚花了三个小时才解决这个问题。我刚刚将一个项目升级到4.2版本,但由于某种原因它无法正常工作。
最终,我移除了Entitlements.plist文件并重新创建了一个新的。
文件>新建文件>代码签名>授权
将文件命名为Entitlements.plist。
确保它在xCode中的资源组中。
它没有在Entitlements.plist文件中加入get-task-allow BOOL类型。我添加了它,检查了它,保存了它,然后取消了它,再次保存了它。这让我感觉好多了。
然后我移除了我创建的Adhoc和Release配置文件。从Provisioning Portal重新下载它们并将它们拖回xCode组织器中。
然后我进入构建设置,确保正确的配置文件分配给了Debug和Release配置文件。
然后我将其更改为Release/Device。点击构建按钮,它就可以工作了。
我不知道为什么。

1

对我来说,下面的方法解决了这个问题:https://coderwall.com/p/-ckobg

  1. 打开Project.xcodeproj > project.pbxproj
  2. 删除所有类似以下这些行:
    1. PROVISIONING_PROFILE = ...
    2. "PROVISIONING_PROFILE[sdk=iphoneos*]" = ...
    3. CODE_SIGN_IDENTITY = ...
    4. "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ...
  3. 再次为目标设置配置文件和代码签名

这解决了我的问题。具体来说,是CODE_SIGN_IDENTITY = ...这一行引起了问题。我不知道这是由Xcode何时添加的,还是我自己不小心添加的,但真是一团糟。与其他IDE相比,我在Xcode上遇到了很多奇怪的问题。我尽量避免使用它,而是坚持使用AppCode。 - Tobiaswk

1
在Xcode 5.1中,如果您进入"偏好设置->帐户->查看详细信息..."。
请确保签名标识状态为有效。如果它显示已吊销,请点击加号按钮并添加相应的签名标识:iOS开发或iOS分发。Xcode会用一个新的、有效的替换它。

1

John的回答正确率达到了99%。我发现(至少在我的配置中),您必须打开项目的构建设置检查器。目标的构建设置不包含“代码签名授权”。如果您的项目中只有一个目标,则可能没有任何区别。但是,如果您有多个目标,则需要转到项目构建设置。无论如何,在执行了John所说的操作之后,我的自定义分发构建完美地工作了。


1
很奇怪,因为我在XCode 3.1的目标设置下有代码签名授权。 - Simon Woodside
如果您将目标的基本 SDK 设置为 iPhone 设备而非模拟器,则会出现代码签名授权。 - Steve Weller

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