2023版使用 PHP 發送 iOS 遠距推播 的範例.
重點 :
1. php curl 要支援 HTTP/2
2.本文使用的是開發者帳號申請的 p8格式的金鑰
基本設定值 : config.php
<?php
$team_id="開發者帳號的TEAM ID";
$key_id="p8金鑰的 Key ID";
$pkey_file="p8 格式的金鑰檔名,絕對路徑";
$topic="App的Bundle ID";
主程式 :
<?php
require_once "config.php";
function Sent_Notification_iOS($team_id ,$key_id,$pkey_file,$topic,$device_token,$payload,$sandbox=false){
$payload = json_encode($payload);
if ($sandbox == true){
//沙盒推送地址
$url = "https://api.sandbox.push.apple.com/3/device/".$device_token;
}else{
//正式環境推送
$url = 'https://api.push.apple.com/3/device/' . $device_token;
}
$jwt = get_JWT($team_id ,$key_id,$pkey_file,$topic);
$headers = array(
'Authorization: Bearer '.$jwt,
'Content-Type: application/json',
'apns-topic: '.$topic,
);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); //這里很關鍵,以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);
curl_close($ch);
// Check the response
/*
if ($http_code == 200) {
return 'Notification sent successfully.';
} else {
echo 'Notification failed with error code: ' . $http_code;
}
*/
return $http_code;
}
function get_JWT($team_id ,$key_id,$pkey_file,$TOPIC){
// 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;
}
發送範例 :
<?php
require_once "iOS_Notification.php";
$device_token="接收端設備碼";//接收端設備碼
$msg=array(
'aps' => array(
'alert' => array (
"title" => "非洲大草原",
"subtitle" => "肯亞",
"body" => "大象一隻"
),
'badge' => 99,
'sound' => "default"
)
);
$r=Sent_Notification_iOS($team_id ,$key_id,$pkey_file,$topic,$device_token,$msg);
在 App 內清除或設定 Badge :
UIApplication.shared.applicationIconBadgeNumber = 0
Payload 各項設定參考資料 :
https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/generating_a_remote_notification