用PHP为iOS做推送服务
首先,需要一个pem的证书,该证书需要与开发时签名用的一致。具体生成pem证书方法如下:
1.登录到iPhone Developer Connection Portal(http://developer.apple.com/iphone/manage/overview/index.action)并点击App IDs
2.创建一个不使用通配符的App ID。通配符ID不能用于推送通知服务。例如,com.itotem.iphone
3.点击App ID旁的“Configure”,然后按下按钮生产推送通知许可证。根据“向导”的步骤生成一个签名并上传,最后下载生成的许可证。
4.通过双击.cer文件将你的aps_developer_identity.cer引入Keychain中。
5.在Mac上启动Keychain助手,然后在login keychain中选择Certificates分类。你将看到一个可扩展选项“Apple Development Push Services”
6.扩展此选项然后右击“Apple Development Push Services” >
Export “Apple Development Push Services ID123”。保存为apns-dev-cert.p12文件。
7.扩展“Apple Development Push Services”对“Private Key”做同样操作,保存为apns-dev-key.p12文件。
8.需要通过终端命令将这些文件转换为PEM格式:openssl
pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
openssl pkcs12
-nocerts -out apns-dev-key.pem -in apns-dev-key.p12
9.如果你想要移除密码,要么在导出/转换时不要设定或者执行:
openssl rsa -in
apns-dev-key.pem -out apns-dev-key-noenc.pem
10.最后,你需要将键和许可文件合成为apns-dev.pem文件,此文件在连接到APNS时需要使用:
cat
apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem
PHP代码如下:
$deviceToken = $_POST['token']; //取得设备的Token,获取方法便见下文
$body= array(“aps” => array(“alert” => ‘message’, “badge” => 2,“sound”=>’default’));//推送方式,包括了提示内容,提示方式和提示声音。
$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”);
//如果你的pem存有密码,需要加一个密码登陆语句
$pass
= ”123123“;
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) {
print “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;
print “sending
message :” . $payload . “\n”;
fwrite($fp, $msg);
fclose($fp);
?>
讲apns-dev.pem和php.php文件放到一个目录下。
进入终端,进入php.php目录下。键入命令php php.phpcategory