在提交时出现Xcode 8错误:“应用程序签名中缺少aps-environment权限”。

126

我有一个应用程序,在过去的6个月中我们已经提交了数十个版本,并且我们确实使用APNS。在升级到Xcode 8后,我收到了来自苹果的以下电子邮件:

尊敬的开发者,
我们发现您最近提交的APP_NAME存在一个或多个问题。您的提交已经成功,但是在下一次提交中,您可能希望纠正以下问题:
缺少推送通知授权 - 您的应用程序包含了苹果的推送通知服务API,但是aps-environment授权在应用程序签名中缺失。为了解决这个问题,请确保您的App ID在Provisioning Portal中启用了推送通知。然后,使用包含aps-environment授权的分发配置文件对您的应用程序进行签名。这将创建正确的签名,然后您可以重新提交您的应用程序。有关更多信息,请参阅“本地和推送通知编程指南”中的“配置和开发”。如果您的应用程序不使用苹果推送通知服务,则无需采取任何操作。您可以从未来的提交中删除API以停止此警告。如果您使用第三方框架,则可能需要联系开发人员获取有关删除API的信息。
在您纠正了这些问题之后,您可以使用Xcode或Application Loader上传新的二进制文件到iTunes Connect。
此致,
App Store团队

奇怪的是,我去了developer.apple.com -> Certificates, Identifiers & Profiles,我的AppId仍然启用了推送通知。我没有做任何与以往不同的事情,所以很好奇Xcode 8更新是否出了问题。有什么想法吗?

顺便说一句:他们在电子邮件中放置的推送通知编程指南链接已经失效,这不是一个好兆头。

11个回答

165

其实很容易。由于某种原因,它在 Xcode 8 上被禁用了,但是进入Targets -> Capabilities并验证推送通知在该视图上是否全部正确即可。对我来说,它有一个“Fix Me”按钮,我需要点击一下,然后就可以了。


对我来说,“Fix Me”添加了一个明确的权限文件(多年来我都没有使用过),一旦我将其删除,推送通知功能就会再次禁用。有人发现如何在不添加权限文件的情况下启用它吗? - villapossu
4
这个问题奇怪的地方不在于解决方案,而在于在 Xcode 7 上它是启用的,但升级后就被禁用了。 - Unome
2
我还必须进入授权文件并将APS环境值更改为“production”,因为在创建时默认设置为“development”。 - Bek
3
终于成功了!真是荒谬,让我费了这么大的力气。我已经删除并重新创建证书/配置文件将近5个小时了。好在我现在可以说我完全理解这些证书/配置文件/标识符是什么了 :) 感谢您的提示。 - Kamil Rykowski
6
请注意,你应该将其保留为"开发"状态。在上传到iTunes Connect后,它会自动更改为"生产"状态。 - Montdidier
显示剩余2条评论

89

我也遇到过同样的问题,我确定在Xcode8中,默认情况下关闭了推送通知。我没有注意到这一点,所以请注意。

capability


1
你能告诉我为什么我的账户中没有推送通知部分吗? - Anuj

29

Xcode 8有一个变化,你的权限不再来自App Identifiers,而是来自于应用程序目标中选择的能力。所以,像Unome(原帖作者)说的一样,你必须验证推送通知是否已经打开。

对于我而言,这不是一个“修复”按钮,而是我有两个权限文件(一个用于开发和一个用于发布)。切换Push Notifications能力可以将aps-environment键添加到开发权限文件中,并使其值为development,但它不会将其添加到发布权限文件中。将相同的键复制到发布权限文件中可以消除上传到iTunes Connect时的警告邮件。

对于大多数项目来说,只需开启Push Notifications即可,或者如果已经开启但权限没有在entitlements中,请尝试将其关闭并重新开启。

还值得注意的是, entitlements会在归档期间自动更新。也就是说,为发行版构建生成的entitlements可能与为开发版构建生成的entitlements不同。详情请参见此处

通过Xcode Organizer的应用分发过程>档案选项卡,在代码签名所使用的配置文件上设置了应用程序的权限。重要的是要意识到,在此阶段重新应用权限会为您之前测试过的任何开发构建创建意外的权限差异。本文档的主要目的是验证您的entitlements是否正确,以进行beta测试和App Store提交。


这就是我的情况,无论我在当前的config/scheme中在我的.entitlements文件中指定什么,它总是使用production作为aps-environment - Albert Bori
2
@AlbertBori 奇怪,我只能让它显示开发模式,因为当它存档时,它会出现为 生产模式 - timgcarlson
我得到了一个名为<product-name>.entitlements的文件,但它的aps-environment值为development。我需要将其复制到哪里以进行分发? - meteors
6
如果值为 development,那应该没问题。当项目被存档时,它将在 ipa 中更改。 - timgcarlson
3
实际上,这并不是在归档过程中发生的。它发生在提交或导出时。此外,检查它是否设置正确的一些有用信息可以在这里找到:https://developer.apple.com/library/content/qa/qa1798/_index.html - Mark Leonard
@MarkLeonard 很好的发现。我刚把它加载到问题中,因为评论可能不会被阅读或被删除... - mfaani

26

根据Xcode 发行说明

Xcode 8在编译时不会自动从配置文件中复制aps-environment授权。这种行为是有意的。要使用此授权,可以在项目编辑器的“功能”选项卡中启用推送通知,或手动将授权添加到授权文件中。(28076333)

这是一个很好的更改,因为aps-environment授权不需要plist文件,但其他许多授权需要,这一点总是很奇怪。

对于那些不想盲目地按“修复”按钮并且当前没有授权文件的人来说,它只是一个plist文件,可以在项目的“构建设置”下引用“代码签名授权”中找到。


1
我在链接的笔记中找不到那个引用! - Iulian Onofrei
我不知道是谁给我的评论点赞了,也不知道出了什么问题,但是现在我也可以找到它了。 - Iulian Onofrei

13

一天的时间里,我们一直在和Xcode 8苦苦斗争,却无法弄清为什么我们的调试构建中缺少aps-environment开发环境。尽管我们已经启用了新的能力(Capability)并存在相应的授权文件,但构建完成的应用程序中,该项在授权部分仍然缺失。问题在于,必须为Xcode Build设置中的任何SDK设置授权文件以进行Debug Entitlements。

screenshot


我认为在为“Debug”键设置值和为“Debug”>“Any SDK”键设置值之间没有任何区别,因为后者用于覆盖特定SDK的值。 - Iulian Onofrei
这对我来说是解决方案。 - Himanth
在整个早上的挣扎中,我也遇到了这个问题。切换功能、生成配置文件都没有用。但是这个方法有效。 - Dave S
在Xcode 8.3.3中,这仍然是某些情况下的有效解决方案。 - dan
我希望我可以投一百万个赞。我已经苦苦挣扎了一个星期,这才是解决办法。仅仅在顶部的代码签名授权中键入文件路径是不够的,还必须在“任何SDK”部分完成。对我来说,这是解决问题的关键。 - Robert Bentley

8
我收到了来自苹果的电子邮件, 使用XCode 7.3.1。我解决问题的方法如下:
  1. 在“Capabilities”下,将PUSH通知设置为ON,如@Bruce Tsai的答案中所述。
  2. 在“Build-Settings”下,“Code Signing” > “Code Signing Identity”将开发者证书设置为调试证书,分发证书则用于发布,如下图所示:

输入图片描述 输入图片描述


嗨,在功能中,我没有得到功能>设置PUSH通知。 - Anuj
@Anuj,我已经在你的Xcode中添加了一个屏幕截图。 - Ruben

5

对我来说自动管理签名是关闭的,我检查后发现它对我有效。


5
如果您正在使用Firebase框架,但没有使用推送通知,有两个解决方案:1.忍受每次上传二进制文件时向整个团队发送的“问题”消息。只要您实际上没有使用通知,该应用程序仍将被接受为提交,您可以忽略警告。或2.执行以下操作:https://dev59.com/k1oU5IYBdhLWcg3we20R#46802075。这将删除烦人的电子邮件通知,并被接受为提交。

3

在使用Xcode 9推送通知时开启了该功能。

我尝试禁用/启用推送通知功能。(未成功)

我尝试禁用/启用自动管理签名。(未成功)

结果我不得不删除并重新添加我的预配配置文件。(点击此处查看如何操作你可能需要在此后禁用/启用自动管理签名


2
对我来说,问题是由于有两个权限文件:Entitlements-Debug.plistEntitlements-Release.plist。只有其中一个(Debug)包含所需的设置。
构建设置 > 签名 > 代码签名权限的多个值更改为单个MyAppName/MyAppName.entitlements,然后重新启用功能 > 推送通知开关对我很有帮助。
希望这可以帮到你。

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