APNS推送通知不适用于生产

我创build了一个应用程序来发送来自Web服务器的远程通知。 当我在开发模式下testing应用程序时,所有的通知在手机上正确到达,AppStore发布后,应用程序没有收到通知。

这就是我所做的:

  1. 为生产创造了一个私钥,一个用于开发。
  2. 生成在我的App ID两个SSL证书通过传递以前的CertFile生成。 我100%确定已经正确生成了2个密钥,并正确传递它们以从AppID下载开发者中心下载SSL证书。
  3. 创build一个文件.pem开发和一个生产(通过转换从我的KeyChain等提取的文件.p12)。
  4. 创build了2个不同的configuration文件,一个用于开发,另一个用于连接到步骤1的AppID。
  5. 使用在步骤4中创build的正确的供应configuration文件在“生成设置”中签署应用程序。
  6. 创build一个Web应用程序来捕获和存储用户令牌。
  7. 创build一个PHP页面来testing推送通知发送。

这里是我testing的:

  1. 在沙箱链接上用telnettesting了开发生成的.pem文件,并给出了一个成功的答案。
  2. 用生产链接上的telnettesting生成的.pem文件,并带有成功的答案。
  3. 我100%肯定已经在我的networking应用程序上存储了我iPhone的开发标志。
  4. 我100%肯定已经在我的networking应用服务器上存储了我的iPhone的生产令牌。
  5. 我100%肯定会通过我的PHP页面正确的消息,苹果服务器(无论是开发和生产)。
  6. 这个php页面总是返回Apple Server的成功消息(包括开发和生产)。

这里是我如何在Xcode上签名的应用程序:

在这里输入图像说明在这里输入图像说明在这里输入图像说明在这里输入图像说明

这里是发送通知的PHP页面的代码:

$ctx = stream_context_create(); //stream_context_set_option($ctx, 'ssl', 'passphrase', 'development_pwd'); //stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck_development.pem'); //$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); //test stream_context_set_option($ctx, 'ssl', 'passphrase', 'production_pwd'); stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck_production.pem'); $fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); //production echo "<p>Connection Open</p>"; if(!$fp){ echo "<p>Failed to connect!<br />Error Number: " . $err . " <br />Code: " . $errstrn . "</p>"; return; } else { echo "<p>Sending notification!</p>"; } $i = 0; foreach ($deviceToken as $dt) { $dt = str_replace(' ' , '' , $dt); $msg = chr(0) . pack('n',32) . pack('H*', $dt) . pack('n',strlen($payload)) . $payload; echo "<p>" . $i . " - Message sent: " . $payload . "<br />Token: ". $dt . "<br />***" . $msg . "***</p>"; $result = fwrite($fp, $msg, strlen($msg)); $i++; if (!$result) echo '<p>Message not delivered ' . PHP_EOL . '!</p>'; else echo '<p>Message successfully delivered ' . PHP_EOL . '!</p>'; } fclose($fp); echo "<p>Total Notifications Sent: " . $i . "</p>"; echo "<p>Connection Closed!</p>"; } ?> 

结论:我在我的PC上安装了接收APNS推送通知的testing应用程序。 我有App Store上发布的完全相同的应用程序,没有收到APNS推送通知。

我真的想尽一切办法解决这个问题,并阅读大约1000页的论坛,stackoverflow和苹果文件。

我愿意报答你们谁帮我find解决我的问题!

你提到的链接是沙盒APNS链接。 生产APNS链接是根据苹果文档是:

您可以通过gateway.push.apple.com ,出站TCP端口2195访问生产环境。

几件事情来validation:

  1. 您的AppId已启用分发APNS。
  2. 您已经创build了分发APNS SSL证书并安装在您的构build机器上(用于App Store提交)。
  3. 您已经在服务器上的步骤2中安装了SSL证书。
  4. 您不会错误地使用开发APNS SSL证书。

生产和沙箱的设备令牌对于同一设备是不同的。

所以尝试通过使用Adhoc或分发证书获取设备令牌,并在生产中使用生成的令牌,这为我工作。

我刚刚遇到同样的问题。 推送通知到达开发模式,而不是生产。 我也检查了几次,确定一切都很好。

但事实并非如此。 这是这个过程的第一步。 创buildcsr。 我确信我不必为开发和生产创build一个csr文件,并最终为两个certificats使用相同的csr文件。 没有工作…

也许有人在将来会犯同样的错误,现在可以节省一些时间。