You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

旧版基于证书的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:06:03