用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