如何在Xcode 4.3中修复“应用程序没有找到有效的'aps-environment'授权字符串”的问题?

159
我一直在努力开发一个简单的iOS应用程序,可以接收推送通知。我的唯一目的是为其他团队成员建立一个使用流程,并且在网上找不到最新、可行的说明。我们的工作室对iOS开发还比较陌生,我个人对iOS开发和Xcode完全没有经验。我已经翻阅了数十篇教程、文章和苹果公司以及其他地方的问题帖子,感觉我可能快要成功了...
以下是我所达到的步骤(请注意,我正在使用Xcode 4.3,最初尝试部署到iOS 5.1,我了解一些东西可能与之前的Xcode版本有所不同,但是我对所有这些都很陌生,并且感到非常困惑和复杂):
1)我在我的iPhone上有一个启用了Push的配置文件
2)在我的测试Xcode项目中,我选择了该配置文件作为签名标识(在“Build Settings> Code Signing”中)

enter image description here

3)我已经在“摘要”和“信息”>“自定义iOS目标属性”下正确设置了我的捆绑标识符*(我想是这样的??)

4)我在委托的didFinishLaunchingWithOptions中调用了registerForRemoteNotificationTypes。

5)我在委托中设置了didRegisterForRemoteNotificationsWithDeviceToken和didFailToRegisterForRemoteNotificationsWithError,以记录设备令牌或错误。

6)我在摘要下方勾选了启用权利。

7)就在那下面,在选择的权利文件中是Tinker6(我的测试项目的名称),当我勾选启用权限时会自动生成。

8)在Tinker6.entitlements文件中,我有以下内容(根据网络上的几篇不同帖子收集到的信息,我认为这是正确的,但无法从苹果官方找到任何明确的说明):

enter image description here

更新

9) 同样,我已经尝试过不使用entitlements文件的整个过程,并且得到了基本相同的结果。

10) 我的mobileprovision文件内容包括正确的entitlements(我已经混淆了数字和域,但结构相同):

<key>application-identifier</key>
<string>12355456A7.com.whatever.tinker</string>
<key>aps-environment</key>
<string>development</string>
<key>get-task-allow</key>
<true/>
<key>keychain-access-groups</key>
<array>
    <string>12355456A7.*</string>
</array>

当我尝试在我的设备上运行此代码时,在Xcode输出中出现以下错误:
2012-06-11 12:45:23.762 Tinker6[13332:707] Failed to get token, error: 
Error Domain=NSCocoaErrorDomain Code=3000 "no valid 'aps-environment' 
entitlement string found for application" UserInfo=0x24a3b0 
{NSLocalizedDescription=no valid 'aps-environment' entitlement string 
found for application}

我已尝试将get-task-allow设置为NO,aps-environment设置为production,以及四种可能的组合,但结果都一样。
如何解决这个问题?在哪里可以找到权威的文档?
--后续背景介绍如下--
就bundle id而言,我仍不清楚应该如何将其设置与Provisioning配置文件中的App Id和Profile id相关联。在Provisioning门户的App Ids下,我有以下内容(再次混淆了数字和域名):

enter image description here

当两个位置设置bundle id时,我有以下内容:

enter image description here enter image description here

我不确定这些是否正确,或者是其中一个还是两个都应该设置为12355456A7.com.whatever.tinker,尽管我在过程中尝试过这些,但没有成功...
注意:我意识到有许多类似标题的帖子,但它们似乎都已过时,基于给出的文件名等内容,并且解决方案似乎都没有用。我希望我提供的更详细的信息将获得高质量的回答。我可能会尽快分配赏金,如果您提供了一个高质量的答案,导致解决方案,我将授予您赏金,并通过Twitter和我的博客推广您的答案。特别是如果您在博客或其他地方发布一个真正好的“这里是您需要进行500个确切步骤来使简单的推送通知应用程序工作,包括配置和其他任何内容”的文章。

重复的帖子,我在这里找到了解决方案:https://dev59.com/L14c5IYBdhLWcg3w-OU4 - gadildafissh
24个回答

95
如果您在配置推送的 app ID 之前创建了您的预配资料,请尝试重新生成预配资料。

iOS预配门户->预配资料->您的证书->编辑->进行编辑->下载新的预配资料

对我有用。现在我能够使用推送功能了。

你能否更明确地说明“重新生成配置文件”具体包含哪些步骤?这是在XCode中的一个步骤,还是在Provisioning Portal中进行的?谢谢! - jwl
2
在门户中,只需添加或删除设备即可生成您的配置文件。之后,双击并安装到您的钥匙串中。 - elp
抱歉如果我有点迟钝,是在“设备”下添加/删除吗?还是在实际的预配文件下面的某个地方,如果是的话,具体在哪里? - jwl
添加或删除设备是重新生成您的配置文件的技巧。您需要重新生成一个配置文件,以使用推送通知,因为它与应用程序 ID 和推送证书相关联。 - elp

71

首先,除非您添加的自定义键/值对不存在于预配配置文件中,否则您不需要使用权限文件。在构建应用程序时,任何来自预配配置文件的权限将被复制到应用程序中。

考虑到您仍然看到关于缺少权限的错误消息,我只能假设构建设置中代码签名选项不正确。

您需要确保为“Debug”配置选择了正确的配置文件,并且为了安全起见,您还需要选择与“Debug”和标有“Any iOS SDK”的子节点相对应的正确配置文件:

enter image description here

尽管此截图显示选择了“Automatic Developer”配置文件,但出于测试目的,从下拉菜单中选择您想要的确切预配配置文件。可能是Xcode自动选择了一个与您想要的不同的配置文件。

还要确保进行干净的构建,完全从设备中删除该应用程序等。这只是为了确保您没有一些旧的垃圾留在身边。


根据我帖子中的第二点,我认为它已经正确设置了,但我添加了一张澄清截图以进行验证。我还尝试完全删除应用程序并将其关闭两天,因为我在某个地方看到有人建议需要一天时间才能重置某些信息(是的,我在抓瞎!?)。但是当你说“您需要确保为“Debug”配置选择了正确的配置文件”时,您到底是什么意思--我在哪里选择? - jwl
如果您点击“iPhone开发人员”部分,或者无论当前值设置为什么,您将看到一个下拉菜单,其中包含Xcode知道的所有配置文件。确保选择了正确的配置文件,或者“自动开发人员”项目正在选择正确的配置文件。下拉菜单应该显示所有内容。 - Mike Weller
你确定你有最新的配置文件吗?可能是你有一个旧版本,之前推送功能还没有启用? - Mike Weller
2
嗯,是的,我相信如此。为了获取新的配置文件,我在Xcode Organizer中删除了库和设备中的配置文件,然后在库屏幕上单击刷新。这将其从Provisioning Portal重新拉回来。然后我将其添加到设备中。正如上面所示,mobileprovision文件的XML内容显示了正确的entitements。 - jwl
3
抱歉,路径前需要加一个 -codesign -d --entitlements - /path/to/my.app。同时,建议你确认一下当前目录是否为 Debug-iphoneos 目录,因为“在 Finder 中显示”有时会导航到错误的位置。 - Mike Weller
显示剩余7条评论

67

我在Xcode 8中遇到了这个问题。 你必须启用目标->能力->推送通知。 请检查截图。

enter image description here


1
这帮了我大忙!!!只需点击一个按钮...解决了我调试了几个小时的问题...还有Xcode8。 - Veck Hsiao
3
哦,谢谢你!让我们期待苹果给我们一个更加合理的错误提示信息吧! - Ferran Maylinch
Xcode 8 关闭了我的应用程序的推送通知,因此这个解决方案有效。 - Kevin
1
谢谢,我在找到这个之前已经做了其他设置步骤三次了。我感觉自己像个白痴,但也觉得工具不好,因为它们允许这成为问题。 - Collin Flynn
希望你的截图包括了侧边栏 - 我花了一点时间才弄清楚它显示的是特定目标的设置,而不是整个项目的设置。 - brichins

47

最简单的方法是从您在Xcode中的账户中完成此操作:

前往Xcode -> 首选项 -> 选择“账户”标签 -> 查看详情 -> 点击左下角的刷新按钮 -> 完成。

重新构建,应该就可以工作了。


19

好的,我之前也遇到过这个问题。由于推送通知需要服务器端实现,所以重新创建配置文件对我来说不是一个选项。因此,我找到了这个解决方案,而不需要创建新的配置文件。

Xcode没有正确选择正确的配置文件,尽管我们已经正确地选择了它。

首先进入“组织者”。在“设备”选项卡中,从库列表中选择我们要使用的意图配置文件。右键单击它,然后选择“在Finder中显示配置文件”。

输入图像描述

正确的配置文件将在打开的Finder窗口中被选中。注意名称。

输入图像描述

现在转到Xcode>日志导航器。选择“所有”和“所有消息”的筛选器。现在在最后阶段(Build Target)中查找名为“ProcessProductPackaging”的步骤并展开它。注意配置文件的名称。如果您遇到错误,则不应匹配。 输入图像描述

现在在打开的Finder窗口中删除Xcode正在使用的不良配置文件。然后再次构建。错误应该得到解决。如果没有,请重复该过程以查找要删除的其他不良配置文件。

希望对您有所帮助。


这是我的错,但我使用了这种方法进行修复。我不小心在信息框中输入了与我生成证书时不同的标识符。 - JavaCoderEx

18
从 XCode 的 Organizer 中删除旧的配置文件。
然后,在启用推送后,为相同的包标识符在 iOS 配置门户中生成新的配置文件。
在 XCode 中导入新的配置文件,并将其设置在应用程序构建设置中。
构建、运行,它可以正常工作。
我刚刚做到了。
从错误到成功只用了 10 分钟。

这个方法对我也起作用了。编辑旧的配置文件并下载并没有奏效。谢谢! - retromuz
作为一个有用的补充,与其获取新的配置文件,我只需删除旧的配置文件即可。 - ritmatter
1
我强烈建议不要手动操作,而是使用 https://github.com/fastlane/PEM。 - fatuhoku

18
答案是:重新开始,做一切相同,但创建一个新的配置文件,并安装它。那个方法奏效了。检查所有细节(在移动配置文件中的授权)看起来与我在这里提问的内容 完全 相同。但现在它可以工作了。苹果公司:什么鬼?

当然,如果可以删除配置文件,这将是显而易见的。但由于无法删除,我不想在团队中堆积大量测试配置文件。尽管如此,最终还是失去耐心并尝试了一下,结果它工作了。随便。


创建一个新档案并像在此其他SO问题中所说的那样“弄脏”旧档案对我有效: https://dev59.com/Km025IYBdhLWcg3w_rFA - scurioni
我所要做的就是从门户网站中删除现有的配置文件并重新创建它。现在更新后,您可以删除配置文件,因此无需创建新的应用程序ID。 - odyth
新的预配文件与相同的应用程序标识和发布证书为我解决了问题。+1 :) - Nazik

17

XCode 6.1.1以及多个苹果开发者账号

这个问题已经得到了相当全面的回答:我今天再次遇到这个问题,这一次是因为我有多个苹果账号。我需要先在 XCode > Preferences > Accounts > + 中添加第二个开发者账号。

确保推送通知功能已打开

接下来,我需要在应用程序中明确启用应用内购买(之前我不需要这样做)。XCode >(应用程序窗口)> Targets > Capabilities > In-App Purchase ON(此时我可以选择正确的证书)。

请注意,我已经通过在 Finder 中双击启用推送的证书进行了添加。

输入图像描述


我一直在为这个问题苦恼,我猜当我切换到Xcode 8 beta时,它关闭了我的推送通知开关或其他什么东西。谢谢。 - inVINCEable
谢谢,这就是为什么我遇到这个问题的原因。我的应用程序 ID 已经启用了应用内购买、游戏中心等功能,但在 Xcode/capabilities 中之前都被关闭,没有问题。自从升级到 Xcode 8 以来,我就一直遇到这个问题。在 Xcode 中启用 IAP 和游戏中心后,问题就解决了! - Ethan Long

11
(Xcode 5)好的,经过一个小时的努力,我解决了我的问题。即使在Xcode 5中重新生成了provisioning file,您也应该手动更新帐户。我只更改了组织者选项卡中的provisioning file,但这并没有起作用,Xcode仍然使用旧的provisioning file进行构建。
所以按照以下步骤操作:
1. 进入Xcode > Preferences > Accounts > View Details(选择您的账户)。 2. 然后刷新您的provisioning files。

8
我的问题很简单,就是我使用了Xcode管理的通配符配置文件进行签名。但是当我创建了一个特定于应用程序的配置文件(并下载、双击它,并确保我的构建设置引用它)后,我成功地收到了APNS设备令牌。

我也遇到了这个问题。Xcode 5 在更新任何预配配置文件方面都非常出色。我在开发后期添加了 APNS 服务。正如上面的帖子所指出的那样,您必须确保您的预配配置文件实际上是针对您正在开发的应用程序的唯一配置文件,而不是通配符。 - Michael
@Michael,您如何确保这一点?我已经尝试在我的构建设置中更改它(在代码签名下),目前设置为“无”。当我选择正确的配置文件并进行构建时,会出现错误,然后回到通配符预配配置文件。 - Ian Jamieson
@ian,你遇到了什么错误?你确定这是一个有效的配置文件吗? - Michael
啊,我已经解决了,我需要重新下载正确的证书到我的Mac。看起来这样做就可以了。谢谢。 - Ian Jamieson
很高兴听到这个消息。当设置正确时,这通常是我所做的。重新生成所有证书。这似乎是问题发生的次数最多的原因。 - Michael

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