找不到应用程序的有效的“aps-environment”权利字符串。

84

我正尝试配置我的应用程序来支持推送通知,但一直报错:

无法获取令牌,错误:Error Domain=NSCocoaErrorDomain Code=3000 "no valid 'aps-environment' entitlement string found for application" UserInfo=0x1f818fc0 {NSLocalizedDescription=no valid 'aps-environment' entitlement string found for application}

  • 我确实启用了应用程序以支持推送通知(目前仅用于开发)。
  • 我是在启用推送通知之后创建的配置文件。
  • 我的捆绑标识符与配置文件中显示的相同。
  • 在我的配置文件中有一个字符串:aps-environment。
  • 我确保在“代码签名身份”部分下,项目和目标中的所有值都选择为我的配置文件。

还有其他想法吗?谢谢。


这个问题你没有任何见解吗?看起来很多人都会遇到... - bashan
11个回答

64

在我的情况下,我的预配文件中的内容:

security cms -D -i ~/Downloads/spolskyDevelop.mobileprovision 
...
<key>application-identifier</key>
<string>P5GM95Q9VV.com.dca.spolsky</string>
<key>aps-environment</key>
<string>development</string>

与实际构建的应用程序中的内容不同(可以通过查看Xcode的Logs选项卡找出其构建位置)

codesign -d --entitlements - '/Users/drew/Library/Developer/Xcode/DerivedData/spolsky-bdbtdfjeeywhqzccpmmceqvnhgtm/Build/Products/Debug-iphoneos/spolsky-ios.app'
<dict>
    <key>application-identifier</key>
    <string>Y2X6Z7Z2GR.com.dca.spolsky-ios</string>
    <key>get-task-allow</key>
    <true/>
    <key>keychain-access-groups</key>
    <array>
        <string>Y2X6Z7Z2GR.com.dca.spolsky-ios</string>
    </array>
</dict>

即使在代码签名身份下的"当前匹配"提示文字指示了正确的配置文件,这仍是真实的。有趣的是,当我运行(Settings->General->Profiles)时,正确的配置文件已经被安装到设备上,使我相信配置文件是正确的,但实际上在应用程序实际启动时它却回退到通配符ID。

关键是这两个命令输出的差异:

Y2X6Z7Z2GR.com.dca.spolsky-iosP5GM95Q9VV.com.dca.spolsky

当我让加粗的部分匹配时,斜体部分自动改变了。另外,security和codesign的输出一致,也没有aps-entitlement错误。

我猜测XCode在非通配符ID上使用了通配符样式匹配("spolsky"几乎是"spolsky-ios"),这解释了"当前匹配"输出的原因。但构建链中的某些内容更加严格,因此会在构建过程中回退到实际通配符ID。


7
我遇到了类似的问题:项目的“构建设置”与目标的“构建设置”不同...在我的情况下,我的目标设置默认选错了描述文件。 - Rob
1
感谢您发现了这个问题,我也遇到了同样的问题。 - Codemonk
1
我的一个同事遇到了这个配置问题。然而,只有在进入Xcode的配置文件设置并刷新证书/配置密钥列表后,我才能选择非通配符配置密钥。 - cbh2000
1
我的“调试”目标设置使用iOS开发人员/自动,这导致我的.app文件出现错误的代码签名身份。我必须明确设置我的项目和目标的调试和发布设置,以使用我的新代码签名ID,我的问题得到了解决。不仅要检查您的预配文件,还要检查那些代码签名身份。没有这些强大的终端命令,我无法解决它! - self.name
6
只是为了记录:为了让推送通知起作用,必须使用一个特定的配置文件,其中包含应用程序的Bundle ID,而不是一个带有 * 通配符的配置文件。 - mgarciaisaia
这是一个很好的答案。我发现我的捆绑标识错误,并且被设置为自动。 - Mike Owens

37

问题是因为当前的预配资料不包含APNS信息,这是由于在创建APNS证书之前创建了预配资料所致。

因此,解决问题的方法是创建一个新的预配资料并选择在Xcode中使用该预配资料,即可消除错误。


它对我没有起作用。还有其他的提示吗?请查看此链接:http://stackoverflow.com/questions/25679750/no-valid-aps-environment-entitlement-string-found-for-application-while-debugg - Ajeet

28

在我的设备上推送通知已经能够正常工作,但是后来出现了相同的问题。似乎Xcode缓存了某些不正确的东西,因此刷新可以解决我的问题:

  1. Xcode -> 首选项 -> 账户
  2. 查看您的开发者帐户的详细信息
  3. 多次点击“刷新”以获取Provision Profiles。我发现每次刷新都会更改这些文件。请一直刷新,直到它们停止更改为止。

很奇怪,这对我起作用了!我一直刷新到它停止更新,然后清理了我的构建文件夹,然后重新启动了XCode。在验证了预配资料中的捆绑标识和已构建应用程序之后(两者匹配),这仍然让我感到困惑。 - Sean Michael Dorian
1
现在没有刷新按钮了。 - Gerry

9

请注意,捆绑标识符必须大小写敏感地与预配文件相匹配。我曾经使用了类似于com.FirstLast.appname的标识符,但实际上应该是com.firstlast.appname。这个问题让我忙碌了很长时间。


我曾经遇到过同样的问题,这个方法解决了我的问题。 - kuba

9
我通过启用推送通知功能来解决了这个问题。
选择项目 > 目标 > 能力 > 打开推送通知。 查看图片

9

我遇到了这个错误,没有创建新的预配文件;创建了一个新的预配文件之后需要重新启动xCode,但现在可以工作了!


3
如果您在升级到Xcode 8后突然遇到此问题,您可能会在能力屏幕中找到一个警告,可以让您自动修复此问题:
选择项目>目标>功能>打开推送通知。

这就是让我免于头痛的东西。谢谢! - jpaljasma

2
我在一个可能不常见的用例中遇到了这个问题。我正在使用Xcode 6和iOS 8创建一系列全新的应用程序项目,并尝试重用相同的捆绑ID,以便不需要再次进行所有门户网站设置。这也仅用于沙盒测试。
我发现,虽然第一个应用程序的设置和注册工作正常,但是如果我从设备中删除该应用程序,并为第二个应用程序设置相同的捆绑ID,然后尝试向该应用程序注册PNs,我会收到此错误。
我的解决方案是:
1. 从设备中删除相关的配置文件。 2. 从Xcode中删除相关的配置文件。 3. 关闭Xcode。 4. 双击下载的`.mobileprovision`文件将其重新安装到Xcode中。 5. 打开项目并部署它。
这种方法似乎能够摆脱先前存在的任何状态,我可以使用新应用程序/相同的捆绑ID注册PNs。

2

Product->Clean对我很有帮助。希望对其他人也有用。


我进行了两种清理。使用命令-选项-Shift-K 进行的次要清理也很有帮助。 - drew..

2

对于在iOS 10中遇到此错误的人,您可以尝试以下步骤:

1. 清理您的项目。
2. 检查Targets -> Capabilities -> Push Notification。如果关闭了,请打开它。

这样问题就会解决。以上步骤帮助我摆脱了这个问题。希望对某些人有所帮助。


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