适配APNs新Provider API的PHP推送脚本语法错误如何解决
报错原因
你遇到的语法错误是因为直接复制了APNs官方文档里的HTTP/2伪头字段定义格式,没有适配PHP的数组语法规则。PHP中以冒号开头的字符串如果作为数组键或者头字段的一部分,没有用引号包裹的话,会被解析为非法标记,触发语法错误。
正确添加必填头字段的方法
新APNs Provider API要求使用HTTP/2协议通信,所有带冒号开头的伪头字段需要按照PHP cURL扩展的要求定义,具体实现步骤如下:
1. 环境依赖检查
确保你的运行环境满足基础要求:
- PHP版本 >= 7.1
- 已开启curl扩展,且libcurl版本 >= 7.38.0,支持HTTP/2协议
- 已准备好新APNs要求的p12推送证书或者p8认证密钥
2. 请求头的正确写法
CURLOPT_HTTPHEADER配置要求每个头字段都是字段名: 字段值格式的字符串,所有伪头直接按该格式写到数组中即可,示例:
// 测试设备token $deviceToken = '你的测试设备唯一标识'; // App的Bundle ID,作为apns-topic值 $bundleId = 'com.yourapp.bundleid'; // 拼接path伪头的取值,固定格式为/3/device/{设备token} $apnsPath = "/3/device/{$deviceToken}"; // 头字段配置 $headers = [ ":method: POST", ":path: {$apnsPath}", "apns-topic: {$bundleId}", "apns-push-type: alert", // 按推送类型选择alert/background/voip等 "Content-Type: application/json" ];
3. 完整请求示例
以p12证书认证为例,完整的cURL请求代码如下:
// 初始化cURL $ch = curl_init(); // 测试环境地址为https://api.sandbox.push.apple.com,生产环境替换为https://api.push.apple.com curl_setopt($ch, CURLOPT_URL, "https://api.sandbox.push.apple.com{$apnsPath}"); curl_setopt($ch, CURLOPT_PORT, 443); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); // 必须指定使用HTTP/2协议 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); // 构造推送payload $payload = json_encode([ 'aps' => [ 'alert' => [ 'title' => '测试推送', 'body' => '新APNs API适配测试通知' ], 'sound' => 'default' ] ]); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 配置p12证书路径和密码 curl_setopt($ch, CURLOPT_SSLCERT, '你的p12证书本地路径'); curl_setopt($ch, CURLOPT_SSLCERTPASSWD, '你的p12证书密码'); // 执行请求并获取结果 $response = curl_exec($ch); $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 调试输出 var_dump($httpStatusCode, $response);
注意事项
- 不要将伪头字段定义为PHP数组的键值对,比如
[':method' => 'POST']属于错误写法,不符合cURL扩展的头字段传参要求 - 测试环境和生产环境的APNs服务地址不可混用,否则会导致推送失败
- 如果使用p8密钥认证,需要额外生成JWT令牌放到
authorization头字段中,不需要配置p12证书相关参数
内容的提问来源于stack exchange,提问作者programcode
相关产品推荐
相关产品推荐

