苹果推送通知不生产

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

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

一切都很好,直到我们提交我们的应用程序,并成为可用的应用程序商店 – 推送通知服务不起作用。 我在网上search,并试图通过人们的build议仔细检查我们的应用程序,但我找不到有什么问题。 所以这个问题贴在这里。

这些是我们所做的:

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

  2. 我们在iOS Provisioning Portal上创build了名为“pushtest”的AppId。 这个ID在开发和生产上都启用了推送通知。

  3. 我们从上面的appId创build了名为“AppMasterPushTest”的开发configuration。 这个configuration是为了进行内部testing,团队中的每个人都在Mac上安装它。

  4. 我们的服务器是由Java实现的,我们使用java-apn包。 在testing过程中,我们下载了用于开发的authentication文件并写出了.p12文件,并通过使用该包的api – withSandboxDestination()将该消息推送到“沙盒”服务器。 testing进展良好,通知收到。

  5. 我认为我们已经准备好了,所以我们创build了另一个名为“AppMaster”的AppId,并且只为生产启用了推送通知。 这个ID是写在应用程序的包标识符。

  6. 我们在步骤5中从AppId开始另一个名为“appMaster”的生产供应,分配方法设置为“App Store”。 下载它并重build应用程序。 这个提交给苹果,并在应用程序stroe活着。

  7. 服务器端,我们下载了生产authentication,并再次写出.p12文件。 并通过使用api-withProductionDestination()将程序推送到生产服务器,并且.p12被写出。

  8. 我们从App Store安装了应用程序。 可悲的是,通知从来没有交付过。

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

任何想法是受欢迎的。

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

上面的评论是不正确的。 应用程序ID在包ID之前有一个前缀:

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

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

validation供应configuration文件中的权利是否正确。 为此,请在文本编辑器中打开.mobileprovision文件。 该文件的内容是用XML构造的。 在Entitlements字典中findaps-environment密钥。 对于开发configuration文件,该密钥的string值应该是开发; 对于分发configuration文件,string值应该是生产

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

在将应用程序发布到应用程序商店之前,您应该使用AdHocconfigurationconfiguration文件testing您的应用程序。 AdHocconfiguration文件与生产推送环境一起使用。

编辑:

有关设备令牌的一些引用:

从本地和推送通知编程指南 :

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

从技术说明TN2265 :

处理格式错误的通知

如果推送服务以某种方式收到不正确的通知,则简单的二进制接口会断开连接。 您的提供商可能会将此视为EPIPE或pipe道发生故障,以响应发送通知。 另一方面,增强的二进制接口将在丢弃连接之前发送错误响应,并提供有关通知错误的更多详细信息。 确保您的提供者正确捕获和处理这些条件。

最常见的问题是无效的设备令牌。 如果令牌来自沙盒环境,例如当您在内部testing开发版本时,则无法将其发送到生产推送服务。 每个推送环境将为相同的设备或计算机发出不同的令牌。 如果您发送设备令牌到错误的环境,推送服务将看到这是一个无效令牌,并放弃通知。

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