如何在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个回答

7
我和其他人一样遇到了同样的问题,并尝试了上述所有方法,但都没有起作用。我甚至删除了账户并使用不同的开发者账户重新开始。
最后对我有用的是:
  1. 按照上述建议创建应用程序ID。
  2. 然后创建配置文件。
  3. 在配置文件的开发部分中,不要使用团队通配符配置文件(由Xcode one管理)。您需要使用已激活推送通知的应用程序ID创建一个单独的配置文件。这样,在开发时,它将具有内置的推送通知功能。
我不知道你是否可以为通配符应用启用该选项,但经过尝试了至少12种不同的建议并失去了几天时间,我希望这可以帮助别人。

2
但这并没有为现有的答案增添任何内容,因为它们已经给出了这个建议。显然,推送应用需要自己的配置文件;文档非常清楚,通配符配置文件不能用于需要特殊授权的任何应用程序。 - matt
1
我已经做了这个,但我的应用程序只会选择通配符配置文件,我无法强制它选择启用推送通知的配置文件。 - Ian Jamieson

4
你提到了一个配置文件,但我没有看到任何关于 Apple Push Profile 的提及。
要使用推送功能,你必须拥有一个推送配置文件(包括开发和发布两种类型)。创建后,你需要确保它包含相关证书(请参阅下面的“编辑”部分)。
这是一个非常好的教程,将带你完成所有步骤:

http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12

我不会尝试撰写像这个教程一样详细的答案,因为这需要我或任何其他人花费数小时的时间,所以我不会尝试,并且在这个教程已经存在的情况下也不会声称赏金。

P.S. 我相信您不再需要权利,这是一个遗留问题。

编辑: 您还应该检查设备上是否有必要的配置文件 - 转到设置,然后选择常规、配置文件,检查您的配置文件是否列出,特别是推送配置文件。 您也可以从XCode的组织器部分检查这一点。在组织器中有两个名为Provision Profiles的部分 - 一个位于左上角的库中(这是您用于签署等的XCode中的配置文件)。此外,您还将看到一个称为连接设备的配置文件的部分,这是安装在手机上的配置文件。 如果您没有在手机上安装它们,可以从配置门户网站下载它们,然后在组织器窗口底部单击添加按钮。

在配置门户中,您还应检查Apple Push Profile是否包括证书: - 单击左侧菜单中的Provisioning - 您将看到您的配置文件列表,请选择编辑Apple push profile - 您将看到一个证书部分,其中列出了您项目中拥有的开发人员、测试人员等。确保为他们选中复选框。 - 您还将看到一个设备部分,请确保已添加正在测试的设备。 如果您在XCode或设备上有任何旧的配置文件,请删除它们,并从配置门户下载/刷新/安装所有新的配置文件。

如果权限是一个遗留问题,那么为什么我会收到关于没有权限的投诉信息?我已经按照链接教程一字不漏地操作了,但还是没有成功...谢谢。 - jwl
另外,我添加了一些关于实际的 mobileprovision 文件的信息,这可能会有用。 - jwl
确实,我甚至没有设置.entitlements也可以成功推送通知。我在进行此操作时遇到的一个问题是,我需要手动下载mobileprovision文件,然后转到“构建设置”并更改签名身份以匹配刚下载的mobileprovision文件。在我的情况下,显然Xcode正在选取通配符mobileprovision文件。 - X Slash
我之前也收到过关于授权的错误消息,但这只是一个误导,可以看一下Mike Wellers的回答,那就是我在我的情况下所做的。 - Gruntcakes
我已经更新了答案,并添加了一些更多的事项供您检查。 - Gruntcakes

2

我自己也遇到了同样的问题。对我来说,问题在于我的产品名称($TARGET_NAME)没有按照苹果提供的证书中呈现的方式进行大写。例如,我有com.companyid.APNDemo,而苹果证书使用的是com.companyid.apndemo。

我将我的目标更改为小写,并且它起作用了。注意:对我来说线索是构建设置中的代码签名设置被设置为我的默认开发人员证书;而不是APNTest预配配置文件。


1
当您的证书过期时,可能会出现此错误。
解决方法是更新证书并使用其签署应用程序。

1
许多以上的答案都是正确的。然而,在处理此问题时似乎存在多个可能的错误。
我遇到的一个问题是我的应用程序ID大小写不一致。我的应用程序ID由于某种原因没有大写,但我的应用程序有。一旦我使用正确的大小写重新创建了应用程序ID,一切都很顺利。希望这可以帮到你。虽然非常令人沮丧。
另外,如果仍无法解决问题,请尝试手动使用“编辑”编辑代码签名标识字段。将第二行更改为正确的配置文件名称。

1

我遇到了类似的问题。由于各种原因,我一直在XCode 7和8之间切换。一旦你使用8来构建,你就需要使用8。我只是使用了Xcode 8并应用了上面建议的一些更改,然后它就起作用了。


1
重新创建临时文件解决了我所有的问题。

1

需要确保您的预配资料(https://developer.apple.com/account/ios/profile/)中有iOS发布资料。

当您从xCode上传到App Store时,请确保在授权文件中具有aps-environment。如果没有,请从“查看账户”->“查看详细信息”->“全部下载”中下载它们。


1
我花了几个小时才解决这个问题。考虑到有些人正在使用自定义脚本来签名和打包,而其他人则使用xcode本身,只有一种方法可以检查最终进入您的应用程序的内容。使用以下命令转储您的权限:

codesign --display --entitlements :- path/to/MyApp.app

并检查aps-environmentapplication-identifier


我一直遇到同样的问题。只想问一下,path-to-app 是针对模拟器上安装的应用程序吗? - Ajeet
不,这是实际设备编译应用程序的路径,在Xcode构建目录中。 - dwery

0

在删除和重新生成AppIDs/Profiles之前,请确保您的库和设备安装了相同(且正确)的配置文件。

我在迁移到新计算机后开始看到这个错误。在迁移之前,推送一直正常工作。

问题是(呃),我没有将配置文件导入到新机器上的Xcode库中(在组织者/设备下的库->配置文件中)。

令人困惑的是,设备已经拥有正确的配置文件,并且在构建设置中按预期显示,因此一切看起来都正确,但是XCode库没有它们,因此它正在使用...签署应用程序???


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