10

从昨天开始,我一直遇到一些设备无法收到推送通知的问题。证书/设备令牌似乎是正确的,因为该设备用于成功接收推送通知,直到昨天。

在服务器端,没有错误或连接拒绝,并且每次推送通知似乎都成功发送。

但是,仍然有很多情况下设备无法正确接收推送。

一些周边信息:

  • 我在生产环境中这样做。
  • 服务器端没有错误/连接拒绝
  • 我每次都发送完全相同的 JSON。
  • 自昨天以来,我们的 2 台设备根本没有收到推送通知
  • 我们的 1 台设备以比昨天更低的成功率(约 70%)接收推送通知
  • 即使是现在,我们的 1~2 台设备仍然可以成功接收推送通知。
  • 直到昨天,上述所有设备都能够在生产环境中正常接收推送通知。

推送成功和设备收不到时,服务器端的结果没有区别......因此几乎不可能识别问题。

这是我正在使用的服务器端 PHP 代码:

        $ctx = stream_context_create();
        stream_context_set_option($ctx, 'ssl', 'local_cert', $this->apnsData[$development]['certificate']);
        $fp = stream_socket_client($this->apnsData[$development]['ssl'], $error, $errorString, 100, (STREAM_CLIENT_C ONNECT|STREAM_CLIENT_PERSISTENT), $ctx);

        if(!$fp){
                $this->_pushFailed($pid);
                $this->_triggerError("Failed to connect to APNS: {$error} {$errorString}.");
        }
        else {
                $msg = chr(0).pack("n",32).pack('H*',$token).pack("n",strlen($message)).$message;
                $fwrite = fwrite($fp, $msg);
                if(!$fwrite) {
                        error_log("[APNS] push failed...");
                        $this->_pushFailed($pid);
                        $this->_triggerError("Failed writing to stream.", E_USER_ERROR);
                }
                else {
                        error_log("[APNS] push successful! ::: $token -> $message ($fwrite bytes)");
                }
        }
        fclose($fp);

日志告诉我推送成功(为隐私切出令牌):

[Wed Dec 12 11:42:00 2012] [error] [client 10.161.6.177] [APNS] push successful! ::: aa4f******44 -> {"aps":{"alert":{"body":"\\u300casdfasdf\\u300d","action-loc-key":"OK"},"badge":4,"sound":"chime"}} (134 bytes)

我该如何解决这个问题?

4

2 回答 2

4

我自己解决了这个问题,所以我会发布一个答案。

我收到的建议是不建议为每条消息打开和关闭套接字,如 Apple 的官方文档中所述:

“您还应该跨多个通知保留与 APN 的连接。APN 可能会将快速且反复建立和拆除的连接视为拒绝服务攻击。一旦发生错误,APN 会关闭发生错误的连接。”

我修复了我的架构,以便在多个 APNS 调用中保持连接,现在它可以正常工作了。我创建了一个基于 apns-php ( https://code.google.com/p/apns-php/ ) 的排队系统。

这是我的代码,供任何需要的人使用:

https://github.com/ashiina/APNS-QueueServer

于 2013-03-06T05:58:42.153 回答
1

首先检查您的设备是否越狱,那么它将不支持 PushNotification。为此,您必须从 Cydia 下载 SAMPref 应用程序并打开该应用程序,然后您的设备支持推送通知。您可以使用应用商店中的 iPusher 应用测试您的设备的推送通知。如果您收到推送通知,则支持您的设备。

之后首先检查您的应用程序是否使用正确的启用推送通知的证书进行签名?

谢谢

于 2012-12-13T04:16:04.813 回答