24

我们完全被卡住了,请帮忙。

我和我的团队制作了一个 iPhone 应用程序,这是我们第一次在 iOS 上尝试。

一切都很好,直到我们提交了我们的应用程序并在应用程序商店中可用 - 推送通知服务无法正常工作。我在网上搜索并尝试按照人们的建议仔细检查我们的应用程序,但我找不到问题所在。所以这个问题贴在这里。

这些是我们所做的:

  1. 我们构建应用程序,假设它被命名为“AppMaster”。

  2. 我们在 iOS Provisioning Portal 上创建了 AppId,名为:“pushtest”。此 ID 在开发和生产中都启用了推送通知。

  3. 我们从上面的 appId 创建了一个名为“AppMasterPushTest”的开发供应。此配置用于内部测试,团队中的每个人都将其安装在他们的 mac 上。

  4. 我们的服务器是由 Java 实现的,我们使用了 java-apn 包。在测试过程中,我们下载了用于开发的认证文件并写出 .p12 文件,并使用该包的 api --withSandboxDestination() 和该 .p12 文件将我们的消息推送到“沙盒”服务器。测试顺利,收到通知。

  5. 我以为我们已经准备好了,所以我们创建了另一个名为“AppMaster”的 AppId,并仅为生产启用了推送通知。此 Id 写在应用程序的包标识符中。

  6. 在第 5 步中,我们从 AppId 为生产创建了另一个名为“appMaster”的 Provisioning,分发方法设置为“App Store”。下载它并重建应用程序。这个已提交给苹果,并在 app-stroe 上运行。

  7. 服务器端,我们下载了生产认证并再次写出.p12文件。并通过使用api-withProductionDestination()编写程序将消息推送到生产服务器,其中.p12刚刚被写出。

  8. 我们从 App Store 安装了该应用程序。遗憾的是,通知从未送达。

我们错过了什么吗?顺便说一句,我们在第 5 步中创建的 id 看起来像“XXX.com.company.appname”,但在应用程序的包标识符中,我们只是设置了“com.company.appname”部分没有前缀。这可能是问题吗?

欢迎任何想法。

请成为我们的救星。谢谢。

4

1 回答 1

30

上面的评论是不正确的。app ID 在 bundle ID 之前有一个前缀:

应用程序 ID 由应用程序的捆绑包 ID 组成,前缀为 Apple 生成的十字符代码。团队管理员必须输入捆绑 ID。对于证书,它必须包含特定的捆绑 ID;您不能使用“通配符”应用程序 ID。

您应该检查您的配置文件,以确保它包含正确的 aps 权利:

验证供应配置文件中的权利是否正确。为此,请在文本编辑器中打开 .mobileprovision 文件。该文件的内容采用 XML 结构。在 Entitlements 字典中找到 aps-environment 键。对于开发配置文件,该键的字符串值应该是开发;对于分发配置文件,字符串值应该是production

您应该确保在向生产 APNS 服务器发送推送通知时使用生产设备令牌(在沙盒环境中工作的设备令牌在生产环境中不起作用)。

在将应用发布到应用商店之前,您应该使用 AdHoc 配置文件对其进行测试。AdHoc 配置文件适用于生产推送环境。

编辑 :

关于设备令牌的一些报价:

来自本地和推送通知编程指南

请注意,生产环境中的设备令牌和开发(沙盒)环境中的设备令牌不是相同的值。

来自技术说明 TN2265

处理格式错误的通知

如果推送服务接收到某种方式不正确的通知,简单的二进制接口会断开连接。您的提供商可能会将此视为 EPIPE 或管道损坏错误,以响应发送通知。另一方面,增强的二进制接口将在断开连接之前发送错误响应,其中包含有关通知错误的更详细信息。确保您的提供商正确捕捉并处理这些情况。

最常见的问题是无效的设备令牌。如果令牌来自沙盒环境,例如当您在内部测试开发构建时,您无法将其发送到生产推送服务。每个推送环境都会为同一设备或计算机颁发不同的令牌。如果您确实将设备令牌发送到错误的环境,推送服务会将其视为无效令牌并丢弃通知。

最后,这篇文章很好地解释了当某些通知无效时(最常见的原因是设备令牌无效)如何向 Apple 发送多个通知,会导致某些有效通知也无法到达。

于 2013-03-24T17:18:15.713 回答