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

apns-collapse-id未替换推送通知:PHP libcurl HTTP/2发送APNs场景

解决APNs推送中apns-collapse-id无法合并通知的问题

首先看你提供的代码,立刻发现了一个明显的错误:apns-collapse-id的HTTP头格式写错了!

你当前的代码里把这个头拆成了两个独立的数组元素:

'apns-collapse-id', 'qwer1235'

这种写法会让libcurl把它们当成两个无效的HTTP头字段发送,APNs服务器根本识别不了这个参数,自然没法实现通知合并的功能。

核心修正步骤

APNs要求apns-collapse-id必须以键: 值的完整字符串形式作为单个HTTP头字段发送,修正后的CURLOPT_HTTPHEADER配置应该是这样:

curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'apns-topic: ' . BUNDLE_ID,
    'Authorization: Bearer ' . generateAuthenticationHeader(),
    'apns-collapse-id: qwer1235' // 这里合并成完整的键值对字符串
]);
$url = "https://api.development.push.apple.com/3/device/[你的设备令牌]"; // 补全完整的APNs请求URL

额外排查要点

如果修正格式后还是有问题,可以从这几个方向检查:

  • collapse ID的一致性:要合并的通知必须给同一个设备发送完全相同的collapse ID,大小写敏感,建议使用字母、数字、下划线这类无特殊字符的取值。
  • 检查APNs响应:添加curl的错误和响应信息打印,确认请求是否被正常处理:
    $response = curl_exec($ch);
    if ($response === false) {
        error_log('Curl error: ' . curl_error($ch));
    } else {
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        error_log('APNs HTTP code: ' . $httpCode . ', Response: ' . $response);
    }
    curl_close($ch);
    
    如果头格式错误,通常会返回400 Bad Request,响应体里会有具体的错误描述。
  • 设备端状态:iOS只会合并同一应用下、相同collapse ID且未被用户查看过的通知。如果用户已经打开过之前的通知,新通知会单独显示,这是系统的正常行为。

内容的提问来源于stack exchange,提问作者Gargoyle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:35:59