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
相关产品推荐
相关产品推荐

