Apple Push Notification service (APNs) 是 iOS 推播訊息的核心機制。本文提供一個完整的 PHP 腳本範例,示範如何使用 SSL 憑證連線至 APNs 沙箱/正式環境,組裝 JSON Payload 並發送推播訊息。
openssl 擴充套件(php_openssl.dll)。.pem 憑證檔(含私鑰與憑證鏈),以及對應的密碼。<?php
// 設定參數
$apnsCert = 'ck.pem'; // 憑證檔路徑
$pass = '123456'; // 憑證密碼
$serverUrl = 'ssl://gateway.sandbox.push.apple.com:2195'; // 沙箱環境
// 正式環境:ssl://gateway.push.apple.com:2195
$deviceToken = 'a8fcd4aa8943b223d4ebcd54fe168a8b99b3f24c63dbc0612db25a8c0a588675';
$message = $_GET['message'] ?? 'hello!';
$badge = (int)($_GET['badge'] ?? 2);
$sound = $_GET['sound'] ?? 'default';
// 組裝 Payload
$body = ['aps' => ['alert' => $message, 'badge' => $badge, 'sound' => $sound]];
$payload = json_encode($body);
// 建立 SSL 串流上下文
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
stream_context_set_option($streamContext, 'ssl', 'passphrase', $pass);
// 連線 APNs
$apns = stream_socket_client($serverUrl, $error, $errorString, 60,
STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $streamContext);
if (!$apns) {
die("連線失敗: $errorString ($error)");
}
echo "Connection OK <br/>";
// 組裝二進位封包(簡易版,僅支援單一裝置)
// 格式:Command(1) + TokenLength(2) + Token(32) + PayloadLength(2) + Payload
$tokenBinary = pack('H*', str_replace(' ', '', $deviceToken));
$msg = chr(0) . pack('n', 32) . $tokenBinary . pack('n', strlen($payload)) . $payload;
// 發送
$result = fwrite($apns, $msg);
fclose($apns);
if ($result) {
echo "發送成功: $payload";
} else {
echo '發送失敗';
}
aps 為固定鍵,支援 alert(字串或物件)、badge(整數)、sound(檔名)、content-available(背景更新)等。chr(0) 代表 Command 0(簡易推播),pack('n', 32) 固定 Token 長度 32 bytes。STREAM_CLIENT_PERSISTENT 可重用連線,大量推播時顯著降低延遲與 CPU 開銷。Apple 已於 2021 年 3 月淘汰舊版二進位協定,強制遷移至 APNs HTTP/2 API。新專案建議使用 guzzlehttp/guzzle 或 edamov/pushok 等函式庫,支援 JWT 認證、多路複用與豐富的回應碼處理。