旧版的苹果APNs接口将会在2021年3月31日废弃(官方通知),因此需要迁移到新的http2协议接口。
1)在调用新接口前,需要先确认服务器是否支持http2协议,在Linux服务器上执行以下命令:
curl --http2 'https://www.baidu.com'
curl: (1) Unsupported protocol
如果显示Unsupported protocol
,则代表服务器不支持http2协议,需要升级curl,如果使用的是ubuntu系统,可以参考这篇文章升级。
2)如果服务器使用的是旧的GeoTrust
CA根证书,需要在2021年3月29日前替换,具体参阅苹果官方通知
3)确认PHP版本,5.5.24版本以上的PHP的curl扩展才支持http2
function send_apns_message() {
// pem格式推送证书文件路径
$certFilePath = '/path/to/pem';
// 推送证书密码,没有密码则留空
$certPwd = '';
// 设备token
$token = 'c63e7xxxxxxxxxxf17d2d5bd743b1681xxxxx692ac3f7fd4a05a14880b4b9ea3';
// APP的bundle ID
$bundleId = 'com.bundle.id';
$url = "https://api.push.apple.com/3/device/{$token}";
// 沙箱环境的推送用下面↓这个接口地址
//$url = "https://api.development.push.apple.com/3/device/{$token}";
// 请求头
$headers = [
"apns-topic:{$bundleId}",
];
// 请求体
$payload = [
'aps' => [
'alert' => [
'title' => 'This is title',
'body' => 'This is content',
],
],
];
$payload = json_encode($payload);
// 发出请求
$ch = curl_init();
$options = [
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0,
CURLOPT_SSLCERT => $certFilePath,
CURLOPT_SSLCERTPASSWD => $certPwd,
CURLOPT_URL => $url,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
];
curl_setopt_array($ch, $options);
$responseBody = curl_exec($ch);
$errno = curl_errno($ch);
if ($errno) {
exit("cURL errno:{$errno}, error:" . curl_error($ch));
}
$responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
var_dump($responseCode, $responseBody);
}
send_apns_message();
如果消息推送成功,HTTP code会返回200,HTTP body会返回空;如果不成功,HTTP body会返回一个JSON,比如{"reason":"MissingDeviceToken"}