应用程序从应用商店返回设备令牌的空值

时间:2012-06-12 11:53:21

标签: objective-c ios xcode push-notification

我已经通过推送通知发布了我的应用更新,但是当我检查我的服务器时,我注意到发送到数据库的令牌是“null”。我使用开发证书和ad hoc的生产证书进行了大量测试。两者都成功地工作但是app store上的版本没有,我不知道为什么。我在2周前发布了这个问题,有人告诉我,我不应该使用我用于临时的配置文件,所以我创建了一个具有相同ID的新配置文件。更新昨天发布,我仍然有同样的问题。我需要找到一个永久的解决方案,因为我的用户对所有这些更新感到恼火,但我不知道如何测试,直到它在应用商店获得批准。

如果有人可以提供想法或帮助,我会非常感激。提前致谢。

P.S。如果它有帮助,我从我的设备中删除了我的应用程序并从应用程序商店再次安装...它没有问我是否要接收推送通知但是从手机设置启用了应用程序...

4 个答案:

答案 0 :(得分:11)

APNs沟通有3个步骤:

  1. 您的应用注册以在您的iOS中的appDelegate中接收APN。这将为您提供一个用于发送通知的deviceToken。
  2. 您的应用将deviceToken发送到您的管理服务器
  3. 您的管理服务器与Apple APNs服务器连接以发送推送通知
  4. 在您的情况下,我了解您的问题出在第1步,因为您说您的设备ID为空,而应用程序并没有询问您有关APN的权限。因此,更改服务器证书或从gateway.sandbox.push.apple.com切换到gateway.push.apple.com不会有帮助,因为错误发生在之前。

    这显然是您的证书问题。您应该检查是否已在 Apple iOS Provisioning Portal 中完成了所有必需的步骤:

    1. 使用您应用的捆绑包标识创建 AppId 。避免使用诸如*。
    2. 之类的野猫
    3. 为您的应用配置InAppPurchase选项(这不是问题,因为它用于通信中的第3步)
    4. 为使用1中使用的AppId 的分发创建配置文件。(我怀疑这可能是您的问题),然后下载
    5. 打开XCode项目设置并检查您的归档操作是否使用了正确的配置文件 3.请确保在Organizer要求时选择正确的配置文件。 (如果前面的步骤没问题,那么这肯定是你的问题,所以双重或三重检查)。
    6. 如果您希望确保使用正确的配置文件生成二进制文件,然后再将其提交到AppStore,请执行以下操作:

      1. 使用Finder打开二进制文件(首先,在Library / Developer / XCode / Archives / ...中打开存档,右键单击它并显示“显示包内容”,导航到/ Products / Applications / youApp,显示包内容再次),
      2. 查找文件embedded.mobileprovision并使用文本编辑器打开它
      3. 在二进制内容中,您应该能够本地化一些名为“application-identifier”和“aps-environment”的字段。检查它们是否具有正确的值。
      4. 我敢打赌,如果您查看以前存档的应用,则会看到错误的个人资料。 这是您的应用无法返回deviceToken的唯一原因。(除非收到它但未正确发送到您的服务器,上述通信的第2步中存在问题)。

答案 1 :(得分:2)

您使用 gateway.push.apple.com 而不是 gateway.sandbox.push.apple.com 吗?

答案 2 :(得分:0)

如果您为应用程序创建了新的配置文件,我认为您还需要在服务器上生成新的证书。

答案 3 :(得分:0)

如果您可以通过连接与包含设备令牌空问题的应用安装的设备来检查“控制台应用”(管理器>设备>控制台)中的应用日志。


  • 基于此 no valid 'aps-environment' entitlement string found for application

    问题是由于当前的Provisioning Profile不包含 APNS信息,因为供应配置文件是在之前创建的 创建APNS证书。

    解决方案:创建新的配置文件&选择Xcode中的Provisioning Profile将清除错误。

  • 您可以执行terminal命令来检查'生产临时 profile'支持apns环境,它应该类似于以下内容:

安全cms -D -i Path_Of_Your_AppStoreDistribution.mobileprovision

<key>Entitlements</key>
<dict>
    <key>application-identifier</key>
    <string>H22LLUHM4D.com.company.appName</string>
    <key>aps-environment</key>
    <string>production</string>
    <key>get-task-allow</key>
    <false/>
</dict>