157

我一直在非常努力地创建一个可以接收推送通知的简单简单的 iOS 应用程序。我这样做的唯一原因是建立一个程序供其他团队成员使用,并且无法在网络上的其他地方找到此类说明的最新工作版本。我们的商店对 iOS 开发者来说相当新,我个人对 iOS 开发者和 Xcode 完全没有经验。我偶然发现了来自 Apple 和其他地方的数十篇教程、文章和问题帖子,我觉得我可能快到了……

这是我要去的地方(请注意,我正在使用 Xcode 4.3 并最初尝试仅部署到 iOS 5.1,我收集到与早期版本的 Xcode 相比,最近有些事情可能发生了变化,但我还是新手这 - 并发现它完全令人困惑和令人费解):

1) 我的 iPhone 上有一个启用了推送的配置文件

2)在我的测试 Xcode 项目中,我将该配置文件选为签名身份(在 Build Settings > Code Signing 中)

在此处输入图像描述

3)我在 Summary and Info > Custom iOS Target Properties 下正确设置了我的包标识符*(我认为??)

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

5) 我的委托中有 didRegisterForRemoteNotificationsWithDeviceToken 和 didFailToRegisterForRemoteNotificationsWithError,分别设置为记录设备令牌或错误

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

7) 选择的权利文件正下方是 Tinker6(我的测试项目的名称),它是在我选中 Enable Entitlements 时自动生成的

8)在 Tinker6.entitlements 文件中,我有以下内容(根据网络上的几个不同帖子,我收集到的内容是正确的,但我无法从 Apple 本身找到任何确定的内容):

在此处输入图像描述

更新

9)另外,我在没有权利文件的情况下尝试了整个事情,并得到了基本相同的结果。

10) 我的 mobileprovision 文件内容包括正确的权利(我打乱了数字和域,但结构相同):

<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 设置为生产,所有四种可能的组合,同样的事情。

我怎样才能克服这个?这方面的权威文件在哪里?

--更多背景信息--

* 至于捆绑包 id,我仍然不清楚应该如何设置与供应配置文件中的应用程序 ID 和配置文件 ID 相关的设置。在 App Ids 下的 Provisioning 门户中,我有这个(再次打乱了数字和域):

在此处输入图像描述

并且设置了捆绑ID的两个地方我有这个:

在此处输入图像描述 在此处输入图像描述

我完全不确定这些是否正确,或者是否应该将其中一个或两者都设置为 12355456A7.com.whatever.tinker,尽管我在此过程的早期尝试了这些但没有成功......

请注意,我意识到有许多具有相似标题的帖子,但是根据给出的文件名等,它们似乎都已过时,而且事实上没有一个解决方案似乎有用。我希望我提供的更详细的信息将保证高质量的响应。我可能会尽快分配赏金,如果你给出一个高质量的答案,我会奖励你赏金,并通过 twitter 和我的博客宣传你的答案。特别是如果您在您的博客或其他内容上交叉发布一篇非常好的“这里是让一个简单的推送通知应用程序正常工作所需的确切500 个步骤,包括配置和其他任何内容”文章。

4

24 回答 24

95

如果您在配置app ID推送之前创建了配置文件,请尝试重新生成配置文件。

iOS Provisioning Portal -> Provisioning -> Your cert -> EDIT -> Make an edit -> Download new provisioning

为我工作。现在我可以使用推送了。

于 2012-06-18T14:17:05.573 回答
70

首先,您不需要权利文件,除非您要添加配置文件中不存在的自定义键/值对。构建应用程序后,配置文件中的任何权利都将复制到应用程序。

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

您需要确保为“调试”配置选择了正确的配置文件,并且为了安全起见,您为“调试”和标记为“任何 iOS SDK”的子节点选择了正确的配置文件:

在此处输入图像描述

尽管此屏幕截图显示选择了“自动开发人员”配置文件,但请从下拉列表中选择您想要的确切配置文件,仅用于测试目的。可能是 Xcode 会自动选择与您想要的配置文件不同的配置文件。

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

于 2012-06-14T14:20:07.397 回答
67

我在 Xcode 8 中遇到过这个问题。您必须启用 Target-> capabilities-> push notification。检查屏幕截图。

在此处输入图像描述

于 2016-09-21T11:46:15.977 回答
47

最简单的方法是使用 Xcode 从您的帐户中执行此操作:

前往 Xcode -> 首选项 -> 选择帐户选项卡 -> 查看详细信息 -> 点击左下角的刷新按钮 -> 完成。

再次构建,它应该可以工作。

于 2014-08-10T11:02:05.770 回答
19

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

尽管我们选择正确,Xcode 没有正确选择正确的配置文件。

首先去组织者。在设备选项卡上,从库列表中配置配置文件,选择我们尝试使用的预期配置文件。右键单击它,然后“在 Finder 中显示配置文件”。

在此处输入图像描述

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

在此处输入图像描述

现在转到 Xcode > Log Navigator。为“全部”和“所有消息”选择过滤器。现在在最后一个阶段(构建目标)寻找名为“ProcessProductPackaging”的步骤展开它。请注意配置文件名称。如果您遇到错误,它们不应该匹配。 在此处输入图像描述

现在在 Opened Finder 窗口中删除 Xcode 正在使用的恶意配置文件。现在重新构建。错误应该得到解决。如果不重复该过程以找到另一个流氓配置文件以将其删除。

希望这可以帮助。

于 2012-11-29T02:48:26.960 回答
18

答案是:重新开始,做同样的事情,但创建一个新的配置文件,然后安装它。那行得通。检查所有细节(移动设备中的权利)看起来与我在这里的问题中的所有内容完全相同。但现在它起作用了。苹果:WAT?

当然,如果可以删除配置文件,这样做是显而易见的。但由于那是不可能的,我不想用一堆测试配置文件让我们的团队混乱。尽管如此,最终还是失去了耐心并尝试了它,它最终起作用了。什么。

于 2012-06-19T16:19:45.760 回答
18

在 Organizer 中从 XCode 中删除旧的配置文件。

然后,在 iOS 配置门户中为相同的包 ID 生成一个新的配置文件(在您启用推送之后)。

在 XCode 中导入新的配置文件,在您的应用构建设置中进行设置。

构建,运行,它工作。

我刚刚做完。

我从错误到成功花了 10 分钟。

于 2013-03-01T20:44:42.910 回答
17

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

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

确保推送通知功能开启

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

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

在此处输入图像描述

于 2015-03-02T03:23:03.490 回答
11

(Xcode 5)好吧,花了一个小时后我解决了我的问题。即使您在 Xcode 5 中重新生成配置文件,您也应该手动更新您的帐户。我只更改了管理器选项卡中不起作用的配置文件,Xcode 使用旧配置文件进行构建。

所以去

Xcode > 首选项 > 帐户 > 查看详细信息(选择您的帐户)

然后刷新您的配置文件。

于 2014-03-26T20:20:19.183 回答
8

我的问题只是我使用 Xcode 管理的通配符配置文件进行签名。

在我创建了一个特定于应用程序的配置文件(并下载它、双击它并确保我的构建设置引用它)后,我成功地收到了一个 APNS 设备令牌。

于 2013-06-24T19:36:18.733 回答
7

我有同样的问题是其他人并尝试了上述所有技巧,但没有任何效果。我什至删除并使用不同的开发者帐户重新开始。

最终对我有用的是

  1. 按照上面的建议做,创建APP ID
  2. 然后创建配置文件
  3. 不要在配置的开发部分使用团队通配符配置文件(由 xcode one 管理)。您需要使用已激活推送通知的应用 ID 单独创建一个。这样,当你开发它时,它就会内置推送通知功能。

我不知道你是否可以为通配符应用启用它,但在尝试了至少 12 种不同的建议并失去了几天之后,我希望这对某人有所帮助

于 2012-11-29T22:45:43.643 回答
4

您提到了配置文件,但我没有看到任何提及 Apple 推送配置文件。

要使用 Push,您必须有一个推送配置文件(有两个,一个用于开发,一个用于发布)。创建它后,您需要确保它包含相关证书(请参阅下面的编辑部分)。

这是一个出色的教程,将引导您完成所有步骤:

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

我或其他任何人都需要花费数小时和数小时来编写像本教程这样的详尽详细的答案,所以当本教程已经存在时,我不会尝试,也不会声称获得赏金。

PS我相信你不再需要权利,这是一个遗留问题。

编辑:您还应该检查设备上是否有必要的配置文件 - 转到设置,然后是一般配置文件,检查您的配置文件是否列出,尤其是推送配置文件。您也可以从 XCode 的 Organizer 部分检查这一点。在 Organizer 中有两个部分表示 Provisioning Profiles - 一个在 Library 的左上角(这是 XCode 中用于签名的配置文件等)。此外,您还会看到一个部分,称为 Provisioning Profiles 用于连接的设备,这个是安装在手机上的配置文件。如果您没有在手机上安装它们,您可以从供应门户网站下载它们,然后单击管理器窗口底部的添加按钮。

在配置门户中,您还应该检查 Apple 推送配置文件是否包含证书: - 单击左侧菜单上的配置 - 您将看到您的配置文件列表,选择编辑 Apple 推送配置文件 - 您将看到证书部分,其中包含您项目中的开发人员或测试人员等列表,请确保选中他们的复选框。- 您还会看到一个设备部分,请确保您正在测试的设备已添加。

如果您在 XCode 或设备上有任何旧配置文件,请删除它们并从配置门户下载/刷新/安装所有新配置文件

于 2012-06-14T02:20:38.910 回答
2

我自己也遇到了同样的问题。对我来说,问题是我的产品名称 ($TARGET_NAME) 的大写方式与苹果提供的证书中显示的方式不同。例如,我有 com.companyid.APNDemo,而 Apple 证书使用的是 com.companyid.apndemo。

我将目标更改为小写,并且有效。注意:对我来说,线索是 Build Settings 中的 codesigning 设置被设置为我的默认开发人员证书;不是 APNTest 配置文件。

于 2012-10-19T21:42:28.007 回答
1

上面的很多答案都是正确的。但是,在处理此问题时似乎存在不止一个可能的错误。

我遇到的问题是我的 App ID 的大小写问题。由于某种原因,我的 App ID 没有大写,但我的应用却是。一旦我用正确的大小写重新创建了 App ID,它就可以顺利进行。希望这可以帮助。虽然令人沮丧。

PS 如果它仍然不起作用,请尝试使用“编辑”手动编辑代码签名身份字段。使用正确的配置文件名称更改第二行。

于 2013-05-08T06:09:55.673 回答
1

我花了几个小时才解决它。鉴于有人使用自定义脚本进行签名和打包,而其他人使用 xcode 本身,因此只有一种方法可以检查您的应用程序中的内容。转储你的权利

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

并检查aps-environmentapplication-identifier

于 2014-04-09T21:51:44.027 回答
1

当您的证书过期时,可能会发生此错误。

解决方案是更新证书并用它签署应用程序。

于 2015-06-23T15:22:15.880 回答
1

您需要确保在您的配置文件 ( https://developer.apple.com/account/ios/profile/ ) 中有一个 iOS 分发配置文件。

当您从 xCode 上传到 App Store 时,请确保您的权利中有 aps-environment。如果没有,请从查看帐户 -> 查看详细信息 -> 全部下载。

于 2016-06-21T19:15:24.417 回答
1

我有一个类似的问题。由于各种原因,我一直在 XCode 7 和 8 之间徘徊。一旦你使用 8 构建,你将需要使用 8。我只是使用 Xcode 8 并应用了上面建议的一些更改并且它工作。

于 2017-02-06T18:19:11.623 回答
1

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

于 2017-02-21T06:33:12.547 回答
0

Xcode 4.6 中的“自动”权利似乎有些古怪。

每个 SDK 都有一个 Entitlement.plist 文件,位于:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/Entitlements.plist

我想出的解决方法是编辑此文件并手动添加偷偷摸摸的 aps-environment 键,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>application-identifier</key>
    <string>$(AppIdentifierPrefix)$(CFBundleIdentifier)</string>
    <key>aps-environment</key>
    <string>development</string>
    <key>keychain-access-groups</key>
    <array>
        <string>$(AppIdentifierPrefix)$(CFBundleIdentifier)</string>
    </array>
</dict>
</plist>

然后,Xcode 正在生成正确的 Xcent 文件,其中包含 aps-environment 键:

/Users/mySelf/Library/Developer/Xcode/DerivedData/myApp-buauvgusocvjyjcwdtpewdzycfmc/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/myApp.xcent

您可以使用 Xcode 的 Log Navigator 找到创建 Xcent 文件的位置,
查找“ProcessProductPackaging”。

不幸的是,这是我发现解决问题的唯一方法。
(现在终于可以正确获取推送令牌了)

只是想知道是否有另一个更优雅的解决方案可用。
有关更多详细信息,请参阅我的 SO 问题:
Xcode 4.6 automatic entitlement not working - “no valid aps-environment”

于 2013-03-28T17:24:37.540 回答
0

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

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

问题是(呃)我没有将配置文件导入新机器上的 Xcode 库(在 Library->Provisioning Profiles 下的 Organizer/Devices 中)。

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

于 2013-04-07T17:26:42.490 回答
0

这就是为我解决的问题。(我已经尝试过打开/关闭功能,重新创建配置文件等)。

Build Settings选项卡的Code Signing Entitlements中,我的.entitlements文件不是所有部分的链接。一旦我将它添加到Any SDK部分,错误就解决了。

在此处输入图像描述

于 2016-12-21T14:40:28.127 回答
0

我尝试了此处列出的所有答案,但没有人解决我的问题。就我而言,这个错误是由于我在创建 Appid 时犯的愚蠢错误。我使用通配符应用 ID而不是使用显式应用 ID导致了问题

如果您希望应用程序接收远程通知(推送通知),那么您需要使用Explicit App ID,例如com.tutsplus.push,而不是com.tutsplus.*

请找到截图, 在此处输入图像描述

于 2017-01-30T13:14:09.053 回答
0

在此处输入图像描述您需要做的就是在 .Entitlements 文件中添加一个密钥。

APS 环境需要添加此密钥,并且根据您的目的,价值应该是开发或生产。

请检查上传的图片

于 2021-02-08T15:11:02.670 回答