旧版基于证书的PHP APNs推送测试脚本能否适配新版APNs Provider API
问题1:旧PHP脚本能否继续使用?
不能。
你当前在用的旧脚本基于苹果早已废弃的APNs二进制协议开发,2021年起苹果全面停止支持旧二进制协议,强制要求使用基于HTTP/2的新版APNs Provider API。你旧脚本里构造的chr(0) + 打包token + 打包payload的二进制报文格式,完全不符合新版接口的要求,所以哪怕TCP连接建立成功、写入数据成功,APNs服务器也会直接丢弃无效请求,不会向设备转发通知。
问题2:必填请求头需要在哪里配置?
所有苹果要求的必填请求头(包括apns-topic、apns-push-type等)都需要在请求APNs接口的代码逻辑里实现,无需在终端执行命令时额外配置。
你测试可用的curl命令本身就是完整的HTTP/2请求实现,请求头是命令内置的参数,对应到PHP代码里就需要自己构造符合要求的HTTP/2请求,把请求头填充进去。
快速修改方案
你可以直接参考可用的curl命令,把旧脚本改成用PHP的cURL扩展实现即可,示例代码如下:
<?php // 配置项 $deviceToken = '你的设备token'; $bundleId = '你的App包名(对应apns-topic的值)'; $certPath = 'aps.cer'; // 你的证书路径 $keyPath = 'PushChatKey.pem'; // 你的私钥路径 $passphrase = '你的私钥密码'; $message = 'Hello!'; // 构造payload $payload = [ 'aps' => [ 'alert' => $message, 'sound' => 'default' ] ]; $payloadJson = json_encode($payload); // 初始化cURL $ch = curl_init("https://api.sandbox.push.apple.com/3/device/{$deviceToken}"); curl_setopt_array($ch, [ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0, CURLOPT_HTTPHEADER => [ "apns-topic: {$bundleId}", "apns-push-type: alert" ], CURLOPT_SSLCERT => $certPath, CURLOPT_SSLCERTTYPE => 'DER', CURLOPT_SSLKEY => $keyPath, CURLOPT_SSLKEYTYPE => 'PEM', CURLOPT_KEYPASSWD => $passphrase, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $payloadJson, CURLOPT_RETURNTRANSFER => true, CURLOPT_VERBOSE => true // 调试时可以打开看详情 ]); // 执行请求 $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode == 200) { echo "消息发送成功\n"; } else { echo "消息发送失败,错误码:{$httpCode},响应内容:{$response}\n"; echo "cURL错误:" . curl_error($ch) . "\n"; } curl_close($ch);
修改后直接执行php simplepush.php即可正常推送。
内容的提问来源于stack exchange,提问作者programcode
相关产品推荐
相关产品推荐

