【问题标题】:How to fix "no valid 'aps-environment' entitlement string found for application" in Xcode 4.3?如何在 Xcode 4.3 中修复“没有为应用程序找到有效的 'aps-environment' 权利字符串”?
【发布时间】:2012-06-14 18:30:28
【问题描述】:

我一直在非常努力地创建一个可以接收推送通知的简单的 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(我的测试项目的名称),它是在我选中启用权利时自动生成的

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

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

-- 后面有更多背景--

*至于 bundle id,我仍然不清楚如何在 Provisioning 配置文件中设置与 App Id 和 Profile id 相关的设置。在 App Ids 下的 Provisioning 门户中,我有这个(再次打乱了数字和域):

并且设置了两个地方的 bundle id 我有这个:

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

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

【问题讨论】:

    标签: ios notifications push-notification apple-push-notifications


    【解决方案1】:

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

    iOS Provisioning Portal -> Provisioning -> Your cert -> EDIT -> Make 编辑 -> 下载新配置

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

    【讨论】:

    • 您能否更明确地说明“重新生成配置文件”的具体含义?这是 XCode 中的一个步骤,在 Provisioning Portal 中,在哪里?谢谢!
    • 在门户中。只需添加或删除设备,您的配置就会生成。之后,双击并安装到您的钥匙串中。
    • 对不起,如果我很密集,但在设备下添加/删除它?或者实际存在问题的 Provisioning Profile 下方的某个位置,如果有,具体在哪里?
    • 添加或删除设备是重新生成配置的技巧。您需要重新生成一个以使用推送通知,因为它链接到应用程序 ID 和推送证书..
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 根据我的帖子中的#2,我认为它设置正确,尽管我添加了一个澄清的屏幕截图来验证。我还尝试完全删除该应用程序并将其关闭 2 天,根据我在某处看到的某些信息需要一天才能重置的建议(是的,我正在抓住稻草!?)。但是,当您说“您需要确保为“调试”配置选择了正确的配置文件”时,您到底是什么意思——我在哪里选择?
    • 如果您单击“iPhone Developer”部分,或者任何设置为当前值的内容,您将看到 Xcode 知道的所有配置文件的下拉列表。确保选择了正确的一项,或者“自动开发人员”项选择了正确的一项。下拉菜单应该会显示所有内容。
    • 您确定您拥有最新的配置文件吗?是不是你有一个旧版本,在启用推送之前?
    • 嗯,是的,我相信。我为获取新的配置文件所做的是,在 Xcode Organizer 中,从库和设备中删除配置文件,然后返回库屏幕单击刷新。这将其从供应门户中拉回。然后我将它添加到设备中。如上所示,mobileprovision 文件 XML ish 内容显示了正确的实体
    • 啊,对不起。路径前需要有一个-codesign -d --entitlements - /path/to/my.app。此时还值得仔细检查您是否位于 Debug-iphoneos 目录中,因为“在 Finder 中显示”有时会将您带到错误的位置。
    【解决方案3】:

    我在 Xcode 8 中遇到过这个问题。 您必须启用目标—> 功能—> 推送通知。 检查屏幕截图。

    【讨论】:

    • 这帮帮我!!!!只需单击一个按钮...解决我调试了几个小时的问题... Xcode8,也是。
    • 天哪,谢谢!加油苹果,给我们一个更合理的错误信息!
    • Xcode 8 为我的应用关闭了推送通知,所以这个解决方案有效。
    • 谢谢,在我找到这个之前,我必须完成其他设置步骤 3 次。我觉得自己像个白痴,但工具也不好让这成为问题。
    • 你救了我的命,伙计!
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

      虽然我们选择正确,但 Xcode 没有正确选择正确的配置文件。

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

      将在打开的 Finder 窗口中选择正确的配置文件。记下名字。

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

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

      希望这会有所帮助。

      【讨论】:

      • 这是我的错,但使用此方法修复了它。我不小心在信息框中输入了与生成证书时使用的标识符不同的标识符。
      【解决方案6】:

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

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

      【讨论】:

      • 创建一个新的配置文件并像在另一个 SO 问题中所说的那样“弄脏”旧的配置文件对我有用:stackoverflow.com/questions/5681172/…
      • 我所要做的就是从门户中删除现有的配置文件并重新创建它。您现在可以在更新后删除配置文件,因此无需创建新的应用 ID。
      • 具有相同应用 ID 和分发证书的新配置文件为我解决了这个问题。 +1 :)
      【解决方案7】:

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

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

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

      构建,运行,它可以工作。

      我刚刚做到了。

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

      【讨论】:

      • 这对我也有用。编辑旧的配置文件和下载对我不起作用。谢谢!
      • 作为一个有用的附录,我没有获得新的配置文件,而是简单地删除了旧的
      • 我强烈建议不要手动操作。使用github.com/fastlane/PEM
      【解决方案8】:

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

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

      中添加第二个开发者帐户

      确保推送通知功能开启

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

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

      【讨论】:

      • 一直在为此苦恼,我想当我切换到 Xcode 8 测试版时,它关闭了我的推送通知开关或其他东西。谢谢
      • 谢谢,这就是我遇到这个问题的原因。我的应用 ID 已为应用内购买、游戏中心等启用,但在 Xcode/capabilities 中它们之前都已关闭,没问题。自从更新到 Xcode 8 后,我就遇到了这个问题。在 Xcode 中启用 IAP 和游戏中心后,问题就消失了!
      【解决方案9】:

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

      所以去

      Xcode > Preferences > Accounts > View Details(选择您的帐户)

      然后刷新您的配置文件。

      【讨论】:

        【解决方案10】:

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

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

        【讨论】:

        • 我也有这个问题。 Xcode 5 非常擅长更新任何配置文件。我在开发后期添加了 APNS 服务。您必须确保正如上面的海报所指出的那样,您的配置文件实际上是您正在开发的应用程序所独有的配置文件,而不是通配符。
        • @Michael,你如何确保这一点?我尝试在我的构建设置中更改它(在代码签名下),目前设置为无。当我选择正确的配置文件并构建时,它会出现错误,然后返回通配符配置文件。
        • @ian 你遇到了什么错误?您确定它是有效的个人资料吗?
        • 啊,我已经整理好了,我需要重新下载正确的证书到我的Mac。这似乎成功了。谢谢。
        • 很高兴听到这个消息。当设置似乎正确时,我通常会这样做。重做所有证书。问题似乎不止一次。
        【解决方案11】:

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

        最终对我有用的是

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

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

        【讨论】:

        • 但这对现有答案没有任何帮助,现有答案已经给出了这个建议。显然,推送应用程序需要自己的配置文件;文档非常清楚通配符配置文件不能用于任何需要特殊权利的应用程序。
        • 我已经这样做了,但是我的应用程序只会选择通配符配置文件,我不能强制它选择启用推送通知的配置文件。
        【解决方案12】:

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

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

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

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

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

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

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

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

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

        【讨论】:

        • 如果权利是遗留问题,那么为什么我会收到一条抱怨没有权利的消息?我已经按照链接的教程没有运气......不过谢谢。
        • 另外,我添加了一些有关实际 mobileprovision 文件的信息,这些信息可能有用。
        • 是的,我什至没有设置任何 .entitlements 来成功推送通知。当我这样做时让我绊倒的一件事是我需要手动下载mobileprovision,然后去构建设置并更改签名身份以匹配刚刚下载的那个,在我的情况下,显然Xcode正在选择通配符mobileprovision。
        • 我不久前也收到了一条关于权利的错误消息,这是一条红鲱鱼,请参阅 Mike Wellers 的回复,这就是我在我的案例中所做的。
        • 我已经更新了答案,提供了更多内容供您检查。
        【解决方案13】:

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

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

        【讨论】:

          【解决方案14】:

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

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

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

          【讨论】:

            【解决方案15】:

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

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

            并检查aps-environmentapplication-identifier

            【讨论】:

            • 我也遇到了同样的问题。只是想问一下,路径到应用程序是否适用于安装在模拟器上的应用程序?
            • 不,这是实际设备编译后的应用程序的路径,在xcode构建目录中。
            【解决方案16】:

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

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

            【讨论】:

              【解决方案17】:

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

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

              【讨论】:

                【解决方案18】:

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

                【讨论】:

                  【解决方案19】:

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

                  【讨论】:

                    【解决方案20】:

                    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 的日志导航器找到创建 Xcent 文件的位置,
                    寻找“ProcessProductPackaging”。

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

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

                    【讨论】:

                      【解决方案21】:

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

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

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

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

                      【讨论】:

                        【解决方案22】:

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

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

                        【讨论】:

                          【解决方案23】:

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

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

                          请找到截图,

                          【讨论】:

                            【解决方案24】:

                            您只需在.Entitlements 文件中添加一个密钥。

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

                            请检查上传的图片

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 2012-11-06
                              • 2012-09-20
                              • 2017-02-04
                              • 2015-02-04
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多