通过PHP与APNS进行通信


Communicate with APNS from PHP

我想通过PHP脚本与Apple推送通知服务进行通信。但我不断得到以下错误:

警告:stream_socket_client():无法设置私钥文件

我有一个.pem文件,看起来像这样:

-----BEGIN CERTIFICATE-----
     Encrypted String
-----END CERTIFICATE-----
     Bag Attributes
     friendlyName: ...
     localKeyID: ...
     Key Attributes: ...
-----BEGIN RSA PRIVATE KEY-----
     Proc-Type: ...
     DEK-Info: ...
     Encrypted String
-----END RSA PRIVATE KEY-----

我正在从sudo运行PHP脚本。它可以找到我的.pem file,因为如果我删除它,我会得到一个"handshake failure"错误。

这里可能出了什么问题?

我最近制作了一个发送远程推送通知的脚本。我就是这样做的:

  $message = "A cool message!";
  $deviceid = "";
  $count = 0;
  $ctx = stream_context_create();
  stream_context_set_option($ctx, 'ssl', 'local_cert', 'apns-dev.pem'); 
  $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
  if (!$fp) {
     echo 'Failed to connect ' . $err . $errstr;
  } else {
     $payloads['aps'] = array('alert' => $message, 'badge' => 1, 'sound' => 'default');
     $payload = json_encode($payloads);
     $msg = chr(0) . pack('n',32) . pack('H*', $deviceid) . pack('n',strlen($payload)) . $payload;
     fwrite($fp, $msg);
     $count += 1;
     fclose($fp);
  }   
  echo 'Sended: ' . $count;

我让它工作起来了。事实证明,我导出了我为推送通知生成的私钥,而不是相应的证书。