推送通知已成功发送,但设备偶尔无法收到。

10

最近出现了一些设备无法接收推送通知的问题,从昨天开始。证书/设备令牌似乎是正确的,因为这些设备直到昨天都能成功地接收到推送通知。

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

但是,仍然有很多情况下设备未能正确地接收到推送通知。

以下是一些相关信息:

  • 我正在生产环境中进行此操作。
  • 服务器端没有错误/连接拒绝
  • 我每次发送完全相同的JSON。
  • 昨天起我们有两个设备根本无法接收到推送通知
  • 我们的一个设备接收推送通知的成功率比昨天低(约为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);

日志告诉我推送成功了(为保护隐私,已删除token):

[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)

我该如何解决这个问题?


所以我收到了建议,每个消息都打开和关闭套接字并不推荐,正如苹果的官方文档中所述:“您还应该在多个通知中保留与APNs的连接。 APNs可能会将快速且重复建立和拆除的连接视为拒绝服务攻击。发生错误时,APNs会关闭发生错误的连接。”因此,我将尝试修复我的架构,以便在多个消息之间重用连接。任何有关设计系统以重用连接的建议都将是不错的。谢谢。 - ashiina
1
你发送了多少个推送通知? - hjm
@hjm 我会说每秒超过2个。应用程序已经在商店上发布,因此我们已经拥有了活跃的用户群。 - ashiina
2个回答

4
我自己解决了这个问题,所以我将发布一个答案。
我收到建议,每个消息都打开和关闭套接字不是推荐的做法,正如苹果官方文档中所述:
“您还应保留与 APNs 的连接跨多个通知。APNs 可能会将快速且反复建立和拆除的连接视为拒绝服务攻击。在出现错误时,APNs 将关闭发生错误的连接。”
我修复了我的架构,以便连接在多个 APNS 调用期间保持不变,并且现在可以正常工作。 我基于 apns-php 创建了一个排队系统(https://code.google.com/p/apns-php/)。
以下是我为需要的任何人提供的代码: https://github.com/ashiina/APNS-QueueServer

1

首先,请检查您的设备是否已越狱,如果是,则不支持推送通知。因此,您需要从Cydia下载SAMPref应用程序并打开该应用程序,然后您的设备即可支持推送通知。您可以使用应用商店中的iPusher应用来测试设备的推送通知。如果您收到推送通知,则说明您的设备被支持。

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

谢谢。


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