推送通知发送成功,但该设备没有收到(偶尔)(Push notification is success

2019-08-03 22:45发布

我一直有在那里有些设备将不会收到一个推送通知,从昨天的一个问题。 证书/设备令牌似乎是正确的,因为该装置用来成功地接收推送通知,直到昨天。

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

但尽管如此,也有许多场合的设备无法正常收到推送。

周围的一些信息:

  • 我对生产环境这样做。
  • 在服务器端没有错误/连接拒绝
  • 我送完全相同的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)

我该如何解决这个问题?

Answer 1:

由我自己解决了这一点,所以我将发布一个答案。

我收到意见,建议不要打开和关闭的每一个消息的插座,如苹果公司的官方文件指出:

“你也应该保留跨多个通知的APN连接。APN的可以考虑迅速和反复建立和拆除的拒绝服务攻击的连接。一旦错误,关闭的APN上发生错误的连接。”

我固定我的架构,使得连接保持整个多个APNS通话,而现在它是工作没有任何问题。 我创建(基于APNS-PHP中的排队系统https://code.google.com/p/apns-php/ )。

这里是我的代码,任何人谁需要它:

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



Answer 2:

首先检查您的设备是否越狱,那么它不会支持PushNotification。 对于您要在Cydia下载SAMPref应用程序,打开应用程序,然后你的设备支持推送通知。 您可以使用iPusher应用从应用商店测试设备推送通知。 如果您收到推送通知则支持您的设备。

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

谢谢



文章来源: Push notification is successfully sent, but the device does not receive (occasionally)