苹果推送通知在生产环境中无法工作

24

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

我和我的团队制作了一个 iPhone 应用,这是我们第一次尝试 iOS 开发。

一切都很顺利,直到我们提交应用并在应用商店上架后——推送通知服务就无法工作了。我在网上搜索并按照其他人的建议对我们的应用进行了仔细检查,但我找不出问题所在。因此,我在这里发布了这个问题。

以下是我们所做的事情:

  1. 我们构建了应用程序,将其命名为“AppMaster”。

  2. 我们在 iOS 证书门户上创建了名为“pushtest”的 AppId。该 ID 启用了开发和生产环境下的推送通知功能。

  3. 我们从上述 AppId 创建了一个名为“AppMasterPushTest”的开发 Provisioning。此 Provisioning 用于内部测试,团队中的每个人都在自己的 Mac 上安装了它。

  4. 我们的服务器使用 Java 编写,并使用 java-apn 包。在测试过程中,我们下载了开发环境的证书文件,并输出了 .p12 文件。然后我们使用该包的 api--withSandboxDestination() 和该 .p12 文件将消息推送到“沙盒”服务器进行测试,测试结果良好,通知正常接收。

  5. 我以为我们已经准备好了,于是我们创建了另一个名为“AppMaster”的 AppId,并仅在生产环境中启用推送通知。此 Id 写入应用程序的 Bundle Identifier 中。

  6. 我们使用 AppId(步骤 5 中创建的)创建了另一个名为“appMaster”的生产 Provisioning,其中分发方式设置为“应用商店”。我们将其下载并重新构建应用程序。该应用程序被提交到 Apple,并在应用商店上线。

  7. 在服务器端,我们再次下载了生产环境的证书并输出了 .p12 文件。然后,我们编写程序使用 api--withProductionDestination() 和刚刚输出的 .p12 文件将消息推送到生产服务器。

  8. 我们从应用商店安装了应用程序。可悲的是,推送通知从未被传递。

有什么我们漏掉的吗?顺便提一下,我们在第五步创建的ID看起来像是“XXX.com.company.appname”,但在应用程序的Bundle Identifier中,我们只设置了前缀为“com.company.appname”的部分。这可能是问题所在吗?

欢迎任何想法。

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


1
你自己说了。推送应用程序 ID 和实际的捆绑包 ID 应该是相同的。你的证书也可能有问题。确保你的主要分发证书和推送证书使用相同的 SSH RSA 密钥对进行签名。 - Kyr Dunenkoff
你可以尝试将.p12文件转换成.pem文件,然后通过PHP发送推送。这是链接 - http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12 - Reno Jones
谢谢大家。关于应用程序ID,我认为Eran是正确的。我们的服务器是纯Java,添加PHP功能将需要太多工作。 - Hetfield Joe
1个回答

30

上面的评论是不正确的。应用程序ID有一个前缀,位于包标识符之前:

应用程序ID由苹果生成的十个字符代码和应用程序的包标识符组成。团队管理员必须输入包标识符。对于证书,它必须包含特定的包标识符;您不能使用“通配符”应用程序ID。

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

验证配置文件中的授权是否正确。要执行此操作,请在文本编辑器中打开.mobileprovision文件。文件内容以XML格式结构化。在Entitlements字典中找到aps-environment键。对于开发配置文件,此键的字符串值应为development;对于发布配置文件,字符串值应为production

在向生产APNS服务器发送推送通知时,您应该确保使用的是生产设备令牌(在沙盒环境中有效的设备令牌在生产环境中无效)。

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

编辑:

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

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

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

来自技术备注TN2265

处理格式错误的通知。

简单二进制接口会在推送服务收到某些不正确的通知时断开连接。您的提供商可能会将此视为EPIPE或破损管道错误,作为发送通知的响应。另一方面,增强型二进制接口将在断开连接之前发送带有更详细信息的错误响应,说明通知存在什么问题。请确保您的提供商妥善捕获和处理这些情况。
最常见的问题是无效的设备令牌。如果令牌来自沙盒环境(例如,当您在公司内部测试开发构建时),则无法将其发送到生产推送服务。每个推送环境都会为相同的设备或计算机发出不同的令牌。如果您将设备令牌发送到错误的环境中,推送服务将将其视为无效令牌并丢弃通知。
最后,这篇文章很好地解释了在向苹果发送多个通知时,当其中一些通知无效(最常见的原因是无效的设备令牌)时,会导致一些有效通知也无法到达。

1
谢谢Eran,我们已经检查了我们的配置文件,它确实有“aps-environment”键,值为“production”。现在我不确定设备令牌,但对于我的iPhone,我们的系统确实显示了两个不同的令牌。还在努力解决中... - Hetfield Joe
4
如果您拥有同一设备的两个令牌,其中只有一个能在生产环境中起作用。如果您试图同时发送这两个令牌,则可能会导致两个令牌都无法正常工作,尤其是当您首先发送错误的令牌(这将关闭连接)时。 - Eran
1
这是一个新想法。我会对其进行检查。 - Hetfield Joe
2
嗨,Eran,它起作用了。虽然我不确定这是否是问题,但它确实起作用了。我们从数据库中删除了所有令牌,并使用“仅生产”令牌重新创建了它们,过了一会儿,消息就被传送了。你知道的,感觉就像在找到钥匙之前门已经打开了。非常感谢我们团队的支持,干杯!(开发中心有关于这个问题的文档吗?这可能会给每个人带来麻烦。) - Hetfield Joe
1
你如何从设备中删除令牌?有人能提供一些细节吗? - turkenh
显示剩余3条评论

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