iPhone推送通知在沙盒模式下可以工作,但在生产模式下无法工作。

7
正如标题所说,我有一个内置APNS的应用程序。在Sandbox模式下它完美地工作,但在生产模式下则失败了。
似乎我在服务器上有正确的证书,因为我没有从APNS服务中收到错误信息。一切似乎都很正常。我正在使用Aldo Armiento的ApnsPHP。它具有一个内置函数,可以输出来自APNS服务器的结果。当我尝试使用来自商店的应用程序的沙盒时,我会得到一个无效令牌错误(因为沙盒和生产的令牌不同)。当我使用商店中的应用程序与生产证书时,我没有收到任何错误。什么也没有,似乎它已经传递了通知。可惜,它并没有到达我的手机。
因此,证书显然必须没问题。它连接到服务器,发送通知,所有操作都没有错误(我先前确实有错误的证书,所以我知道如果它们不正确会发生什么)。
有什么办法找出错误隐藏在哪里吗?
[编辑]这是我从APNS服务中得到的返回结果:
Tue, 03 Jan 2012 03:13:55 +0100 ApnsPHP[13049]: INFO: Trying ssl://gateway.push.apple.com:2195...
Tue, 03 Jan 2012 03:13:56 +0100 ApnsPHP[13049]: INFO: Connected to ssl://gateway.push.apple.com:2195.
Tue, 03 Jan 2012 03:13:56 +0100 ApnsPHP[13049]: INFO: Sending messages queue, run #1: 1 message(s) left in queue.
Tue, 03 Jan 2012 03:13:56 +0100 ApnsPHP[13049]: STATUS: Sending message ID 1 [custom identifier: Message-Badge-000] (1/3): 107 bytes.
Tue, 03 Jan 2012 03:13:56 +0100 ApnsPHP[13049]: INFO: Disconnected.
6个回答

11

以下是您可以自行检查的三种情况:

  1. 确保您在服务器端使用了正确的生产证书,因为我们需要为生产环境和沙箱环境创建两个不同的证书。请确保您正在使用正确的证书。

  2. 其次,您可以检查您在服务器端是否使用了正确的网关和端口号。由于生产环境和沙箱环境使用的网关不同,因此用于生产环境的网关为:gateway.push.apple.com。此外,请确保您在服务器上使用了证书密码。

  3. 第三,您可以检查设备上的通知是否已启用。您还需要在iPhone上启用它。请确保设备上已经启用了该功能。

如果有帮助,请告诉我。


谢谢 - 但我检查了所有的。每件事都设置好了。正如提到的,我没有从推送服务中得到任何错误,它表现为消息已经传递了......非常奇怪。 - Swissdude
你尝试重新创建生产证书并将其放到你的服务器上了吗? - Sandeep Dhama
1
真是我的错 :) 问题出在证书上。我为另一家公司开发应用,原来的开发人员已经离职,但他的证书似乎仍然有效(尽管我已经用我的证书替换了它)。因此,证书是有效的,并且适用于该应用程序。但二进制文件是使用我的私钥编译的,这可能导致了混淆。感谢您的帮助! - Swissdude
我也遇到了这个问题...在开发环境中,我已经成功实现了推送通知,但是在生产环境中却无法正常工作。您能详细解释一下最后一条评论吗?“二进制文件是使用我的私钥编译的”??我使用具有推送通知权限的分发配置文件对代码进行签名,但是我的生产SSL .pem密钥与构建应用程序无关。(对吗?) - Federico
原来如此 - 我和你一样也遇到了同样的问题。在开发/ adHoc模式下可以正常工作,但是从应用商店分发却无法接收推送通知。似乎iPhone不再向托管PHP脚本以发送PN的服务器发送其凭据。由于我使用Cordova和IBM-Bluemix的一些插件进行开发,所以我不知道可能出了什么问题... - Swissdude

10

对我来说,我为此奋斗了几天。使用正确的生产证书和密钥,以及正确的网关将消息发送到我的开发iPhone时,在沙盒模式下成功发送,但在生产模式下失败了。这是因为还有两种设备令牌,测试iPhone设备令牌是沙盒令牌,不能在生产模式下使用。最好使用另一个设备的令牌来测试生产APNs。

详细的解释在 此处

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


这个人说得很对...谢谢分享这个信息。 - bottus
同意,你说得很对。谢谢!一旦设备令牌在沙盒(api.sandbox.push.apple.com)请求中被使用,请确保在测试生产环境(api.push.apple.com)之前重新启动手机并重新安装应用程序以获取新的设备令牌。 - LineDrop

1

请参考https://stackoverflow.com/a/11623162/496222中的答案。

简而言之:确保两个SSL证书分别存储在不同的PEM文件中。如果将沙盒和生产环境证书存储在同一个PEM文件中,将导致其中任何一个环境失败。


0
请同时检查您的应用程序 ID 是否启用了推送通知。

0

这解决了我的问题,请确保为kGGLInstanceIDAPNSServerTypeSandboxOption设置正确的值。对于开发模式,将其设置为“YES”,对于生产模式则为“NO”。


我认为这似乎是关于谷歌云消息推送的?https://developers.google.com/cloud-messaging/ios/client - Nick

0

你好,你尝试检查你的授权plist了吗?将Entitlements.plist中的APS环境更改为“production”。 在这里查看截图照片


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