iOS 建立遠距推播 App (五) 推播測試 – 使用 php
1.伺服器檢查事項
(1) Web Server 需支援 HTTP/2
檢測方法一 : For Linux $ curl --http2 -I https://www.google.com 不支援出現 : curl : (1) Unsupported protocol 檢測方式二 : 使用 php <?php echo $_SERVER[ "SERVER_PROTOCOL" ];
(2) PHP 版本需 5.5.24 版以上 php 的 curl 才有支援 HTTP/2
2. PHP 程式碼
<?php $team_id=""; //開發者 team ID $key_id=""; //p8 格式證書的 ID $pkey_file="AuthKey_xxxxxx.p8"; //p8證書的存放位址,勿使用中文。絕對路徑 $bundle_id=""; //App的 Boundle ID $device_token=""; //Device token $msg="測試訊息"; $r=Sent_Notification_iOS($team_id ,$key_id,$pkey_file,$bundle_id,$device_token,$msg); function Sent_Notification_iOS($team_id ,$key_id,$pkey_file,$bundle_id,$device_token,$msg){ // Create the notification payload $payload = array( 'aps' => array( 'alert' => $msg, 'sound' => 'default' ) ); $payload_json = json_encode($payload); //正式環境推送 //$url = 'https://api.push.apple.com/3/device/' . $device_token; //沙盒推送地址 $url = "https://api.sandbox.push.apple.com/3/device/".$device_token; $jwt = get_JWT($team_id ,$key_id,$pkey_file,$bundle_id); $headers = array( 'Authorization: Bearer '.$jwt, 'Content-Type: application/json', 'apns-topic: '.$bundle_id, ); $ch = curl_init($url); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload_json); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); //這里很關鍵,以http2發送請求,如果你的curl不支持http2則需要看前面的步驟 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($response); curl_close($ch); // Check the response if ($http_code == 200) { echo 'Notification sent successfully.'; } else { echo 'Notification failed with error code: ' . $http_code; } } function get_JWT($team_id ,$key_id,$pkey_file,$bundle_id){ // token過期時間 $expires = time() + 3600; // Generate the JWT header $header = array( 'alg' => 'ES256', 'kid' => $key_id ); $jwt_header = base64_encode(json_encode($header)); // Generate the JWT payload $payload = array( 'iss' => $team_id, 'iat' => time() ); $jwt_payload = base64_encode(json_encode($payload)); //載入證書文件 $pkey_contents = file_get_contents($pkey_file); $pkey = openssl_get_privatekey($pkey_contents); //JWT 簽名 $signature = ''; openssl_sign($jwt_header . '.' . $jwt_payload, $signature, $pkey, 'sha256'); $jwt_signature = base64_encode($signature); // Generate the final JWT $jwt = $jwt_header . '.' . $jwt_payload . '.' . $jwt_signature; return $jwt; }