发送APNs VoIP通知返回InvalidPushType错误求助
解决APNs VoIP推送InvalidPushType错误
核心问题分析
你的请求存在两个关键错误:
- Content-Type设置错误:APNs要求推送payload为JSON格式,你当前设置的
application/x-www-form-urlencoded会导致苹果服务器无法正确解析推送内容,触发InvalidPushType错误。 - VoIP推送的payload结构不规范:自定义字段不应嵌套在
aps节点内,同时需确保apns-topic正确指向VoIP服务专用ID(App ID + .voip后缀)。
修正后的代码
if (defined("CURL_VERSION_HTTP2") && (curl_version()["features"] & CURL_VERSION_HTTP2) !== 0) { $device_token = "1302E8106AA322DE917B2D0F0FC4D656878F878E8E2FCEA9CEA153D3C80027C7"; // 按苹果规范调整payload结构,自定义字段放在aps外部 $body = [ "aps" => [ "alert" => "callIOS", "sound" => "default" // 可选:添加VoIP推送提示音 ], "id" => "eabeae54-14a8-11e5-b60b-1697f925ec7b", "nameCaller" => "Hien Nguyen", "handle" => "0123456789", "isVideo" => true ]; $header[] = "apns-topic: ao.test.app.voip"; // 确保是App ID + .voip后缀 $header[] = "apns-expiration: 0"; $header[] = "apns-priority: 10"; $header[] = "apns-push-type: voip"; $header[] = "Content-Type: application/json"; // 修正为正确的Content-Type $header[] = "apns-id: eabeae54-14a8-11e5-b60b-1697f925ec7b"; $ch = curl_init(); $url = "https://api.sandbox.push.apple.com/3/device/" . $device_token; curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_HTTPHEADER, $header); curl_setopt($ch,CURLOPT_POSTFIELDS, json_encode($body)); curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); curl_setopt($ch,CURLOPT_SSLCERT, "VOIP.pem"); curl_setopt($ch,CURLOPT_SSLCERTPASSWD, ""); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); // 强制启用HTTP/2 $response = curl_exec($ch); $err = curl_error($ch); print_r(json_decode($response)); print_r($err); // 直接打印错误,无需json_decode curl_close($ch); } else { echo "No HTTP/2 support on client."; }
额外检查项
- 确认
VOIP.pem是专门用于VoIP推送的证书,而非普通APNs证书。 - 验证设备token属于沙箱测试设备,与请求的沙箱环境匹配。
- 确保App已在Xcode中开启
Push Notifications和VoIP Services能力。
内容的提问来源于stack exchange,提问作者Sampaio Pedro
相关产品推荐
相关产品推荐

