代码之家  ›  专栏  ›  技术社区  ›  Jameson

iphone sdk推送通知随机失败

  •  3
  • Jameson  · 技术社区  · 14 年前

    我有一个包含以下内容的php文件,它在开发证书上运行得很好,但是当我切换到生产证书时,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()[函数.stream socket client]:无法设置本地证书链文件`/var/www/vhosts/thissite.com/httpdocs/prod.pem';请检查cafile/capath设置是否在/var/www/vhosts/thissite.com/httpdocs/pushMessageLive.p中包含证书及其颁发者的详细信息HP在线19

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

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

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

    4 回复  |  直到 14 年前
        1
  •  3
  •   ChrisB    14 年前

    我也有同样的问题。你必须与苹果的推送通知服务器建立持久的套接字连接。我为一个名为 皮亚普斯 ( http://github.com/samuraisam/pyapns )对我来说很管用:

    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等,那么这个方法就可以工作。

        2
  •  1
  •   casey    14 年前

    听起来连接太多了。苹果的文档指出,你需要保持连接打开,同时发送尽可能多的信息。重新打开被认为是DoS攻击。所以试着让它持久化,看看是否会出现同样的错误。

        3
  •  0
  •   alleus    14 年前

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

    但另一方面,当我尝试发送一批推送通知时,php却表现得很奇怪。我不确定你的示例代码,但我想你做了 stream_socket_client() fclose() 每次留言?在php中使用ssl套接字的技术,我个人完成的唯一事情就是失败……

    我不确定您是否有可能在服务器上运行ruby,但如果可以,我建议您切换到 ruby-apns-daemon 处理与苹果服务器的对话。它是轻量级的,并且很容易在php中实现(实际上您编写了相同的负载json,但是将它发送到ruby apns守护进程,而不是通过套接字)。

        4
  •  0
  •   Community kfsone    7 年前

    我也有同样的问题,证书也有问题。你可以在这里看到解决方案 How can I do an SSL connection with PHP 这里 Error using ssl cert with PHP .

    希望对你有帮助。

    而且你没有义务和APN建立持久的联系。尽管最好一次发送所有邮件,但您可以多次连接和断开连接。我引用苹果的网站:

    你也应该保持联系 有多个APN 通知。APNS可以考虑 快速且 屡建屡拆 作为拒绝服务攻击。在 错误,APNS关闭上的连接 发生了错误。

    如果你一次不建立上百个联系,你就不会遇到麻烦。