- 由于写php的同学始终不相信自己服务器发送推送有问题,为了让他打脸,我不得不自己亲自动手写一个简单的php发送推送测试了
- 首先生成pem,相信很多人都会也可以上网直接查。很简单
- 导出两个p12
密码暂时设为123456,名字取为cert.p12 key.p12
openssl pckcs12 -clcerts -nokeys -out cert.pem -in cert.p12
openssl pckcs12 -nocerts -out key.pem -in key.p12
openssl rsa -in key.pem -out key.unencrypted.pem
cat cert.pem key.unencrypted.pem > apns-dev.pem
- 将以下代码复制粘贴到一个文件,文件取名push.php,放在一个非中文名的文件夹下(我们敲代码的都不会使用中文名文件夹啦!),将生成pem也放在这个文件夹下:
<?php
$deviceToken= '1a7f863ae00c1a52a5b55798ef2ea0319f748b64edb70ef3d5971fccefff6c61'; //没有空格
$body = array("aps" => array("alert" => 'this is test',"badge" => 2,"sound"=>'warning.caf')); //推送方式,包含内容和声音
$ctx = stream_context_create();
//如果在Windows的服务器上,寻找pem路径会有问题,路径修改成这样的方法:
//$pem = dirname(__FILE__) . '/' . 'apns-dev.pem';
//linux 的服务器直接写pem的路径即可
stream_context_set_option($ctx,"ssl","local_cert","apns-dev.pem");
$pass = "";
stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);
//此处有两个服务器需要选择,如果是开发测试用,选择第二名sandbox的服务器并使用Dev的pem证书,如果是正是发布,使用Product的pem并选用正式的服务器
// $fp = stream_socket_client("ssl://gateway.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
$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 $errstrn";
return;
}
print "Connection OK\n";
$payload = json_encode($body);
$msg = chr(0) . pack("n",32) . pack("H*", str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
echo "sending message :" . $payload ."\n";
fwrite($fp, $msg);
fclose($fp);
?>
php push.php