iPhone SDK推送通知随机失败

时间:2010-03-17 12:54:12

标签: php iphone sdk push apple-push-notifications

我有一个PHP文件,其中包含以下内容,可以完美地用于开发ceritficates,但是当我切换到生产证书时,PHP会出错并给出以下消息,但它只在大约50%的时间内完成。其他50%的工作原理。任何人都知道为什么会这样吗?

<?php
// masked for security reason 
$deviceToken = 'xxxxxx'; // jq

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', dirname(__FILE__)."/prod.pem");

$number = 5;

$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp) {
  print "Failed to connect $err $errstr\n";
}
else {
  print "Connection OK\n";
  $msg = $_GET['msg'];
    $payload['aps'] = array('alert' => $msg, 'badge' => 1, 'sound' => 'default');
    $payload = json_encode($payload);

  $msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
  print "sending message :" . $payload . "\n";
  fwrite($fp, $msg);
  fclose($fp);
}
?>

PHP错误:

警告:stream_socket_client()[function.stream-socket-client]:无法设置本地证书链文件`/var/www/vhosts/thissite.com/httpdocs/prod.pem';在第19行的/var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php中检查您的cafile / capath设置是否包含证书及其颁发者的详细信息

警告:stream_socket_client()[function.stream-socket-client]:无法在第19行的/var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php中创建SSL句柄

警告:stream_socket_client()[function.stream-socket-client]:无法在第19行的/var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php中启用加密

警告:stream_socket_client()[function.stream-socket-client]:无法连接到/ var / www / vhosts / thissite中的ssl://gateway.sandbox.push.apple.com:2195(未知错误)第19行的.com / httpdocs / pushMessageLive.php 无法连接0

4 个答案:

答案 0 :(得分:3)

我有同样的问题。您必须与Apple的推送通知服务器建立持久套接字连接。我已经编写了一个名为 pyapns http://github.com/samuraisam/pyapns)的python守护程序的教程,该程序非常适合我:

http://www.how2s.org/index.php/How_to_get_started_with_Apple_Push_Notifications_for_iPhone_or_iPhone_Touch

这可以假设您正在运行Debian并具有root权限来安装所需的软件包,例如python-twisted,libcurl4-openssl-dev等。

答案 1 :(得分:1)

听起来有太多连接。 Apple的文档声明您需要保持连接打开并同时发送尽可能多的连接。重新开放被认为是DOS攻击。所以试着让它持久化,看看你是否得到同样的错误。

答案 2 :(得分:0)

我不知道你遇到的错误是因为推送服务器连接太多......根据我的经验,这些限制有点难以达到。

但另一方面,当我尝试发送批量推送通知时,PHP表现得很奇怪。我不确定您的示例代码,但我猜你为每条消息做了stream_socket_client()fclose()?在PHP中使用SSL套接字技术,我个人唯一能做到的就是失败......

我不确定您是否有可能在服务器上运行Ruby,但如果可以,我建议切换到ruby-apns-daemon来处理与Apple服务器的对话。它很轻巧,易于在PHP中实现(您实际上组成了相同的有效负载-JSON,但是将其发送到ruby-apns-daemon而不是通过套接字)。

答案 3 :(得分:0)

我遇到了同样的问题,证书有问题。您可以在此处How can I do an SSL connection with PHP和此处Error using ssl cert with PHP查看解决方案。

希望它能帮到你。

对于记录,您没有义务与APNS建立持久的联系。虽然最好一次发送所有邮件,但您可以多次连接和断开连接。我引用Apple的网站:

  

您还应保留连接   与APN跨越多个   通知。 APN可能会考虑   快速连接   反复建立和拆除   作为拒绝服务攻击。上   错误,APN关闭连接   哪个错误发生了。

如果你不是一次创造数百个连接,你就不应该遇到麻烦。