2012-12-12 129 views
9

我一直有问题,一些设备从昨天开始将不会收到推送通知。 证书/设备令牌似乎是正确的, ,因为设备用于成功接收推送通知,直到昨天。推送通知已成功发送,但设备没有收到(偶尔)

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

但是,仍然有很多场合设备没有正确接收推送。

周围的一些信息:

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

如何我解决这个问题吗?

+0

所以,我已经收到建议,打开和关闭插座为每一个消息不是[R推荐,正如苹果公司的官方文件中指出的那样: “您还应该保留多个通知中与APN的连接。 APN可能会考虑快速反复建立连接并将其作为拒绝服务攻击拆除。出现错误时,APN关闭发生错误的连接。“ 因此,我将尝试修复我的体系结构,以便重复使用跨多条消息的连接。设计系统以重用连接的任何建议都很好。谢谢 – ashiina

+1

你发送多少个推送通知? – hjm

+0

@hjm我会说每秒超过2个。应用程序在商店里,所以我们已经有一个活跃的用户群。 – ashiina

回答

4

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

我已经收到了,不建议打开和关闭的每一个消息的插座,在苹果的官方文件中明确提出的建议是:

“你也应该保留跨多个通知的APN连接。APN可能会考虑快速反复建立连接并将其作为拒绝服务攻击拆除。在错误的APN关闭上发生错误的连接。”

我固定我的架构,使得连接保持整个多个APNS呼吁,现在它正在没有任何问题。 我创建了一个排队系统基于APNS-PHP(https://code.google.com/p/apns-php/

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

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

1

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

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

谢谢

相关问题