首次通过Terminal与.pem文件发送Apple呼叫通知时遇curl错误求助
使用curl + .pem文件发送APNs呼叫通知时终端报错
我尝试通过Terminal结合.pem证书文件向苹果开发环境推送CallKit呼叫通知,本地应用代码无异常,已正确获取pushregistrytoken,执行的curl命令如下:
curl -v -d '{"aps":{"alert":"hello"}}' --http2 --cert Certificates.pem:1234 https://api.development.push.apple.com/3/device/pushregistrytoken
使用了HTTP/2协议,这是我首次尝试通过终端发送推送通知,请求协助排查错误原因。
排查方向与解决方案
1. 验证.pem证书完整性与有效性
- 确保你的
Certificates.pem是证书+私钥的合并文件,单独的证书或私钥都会导致认证失败。正确生成步骤:# 把苹果下载的.cer证书转成pem格式 openssl x509 -in aps_development.cer -inform der -out certificate.pem # 把本地导出的.p12私钥转成pem(无密码则去掉-nodes) openssl pkcs12 -in push.p12 -out privatekey.pem -nodes # 合并两个文件 cat certificate.pem privatekey.pem > Certificates.pem - 用openssl验证证书能否连接APNs服务器:
若输出中包含openssl s_client -connect api.development.push.apple.com:443 -cert Certificates.pem -key Certificates.pemVerify return code: 0 (ok),说明证书有效;否则检查证书是否过期、是否对应开发环境(别用生产环境证书)。
2. 确认pushregistrytoken的正确性
- 确保token是开发环境生成的,生产环境token无法在
api.development.push.apple.com使用。 - 检查token格式:必须是64位十六进制字符串,无空格、换行或其他特殊字符。
3. 修正curl命令参数
- 确认
--cert后的1234是你转换.p12时设置的密码,若转换时没设密码,直接去掉:1234。 - 添加
Content-Type请求头,明确告知服务器请求体是JSON格式:curl -v -H "Content-Type: application/json" -d '{"aps":{"alert":"hello"}}' --http2 --cert Certificates.pem:1234 https://api.development.push.apple.com/3/device/pushregistrytoken
4. 检查网络与账号权限
- 测试网络能否访问APNs:用telnet或ping验证
api.development.push.apple.com的443端口是否可达,部分公司网络可能屏蔽该端口,可换手机热点试试。 - 确认开发者账号已为应用开启Push Notification服务,且应用ID的配置正确。
5. 解析curl的详细错误日志
执行命令时的-v参数会返回完整请求/响应信息,重点看:
- HTTP状态码:比如
400(请求格式错)、403(证书/权限问题)、410(token已失效)、500(服务器临时故障)。 - 响应体的错误描述:苹果会返回具体原因,比如
BadDeviceToken(无效token)、InvalidProviderToken(证书无效),根据提示针对性修复。
内容的提问来源于stack exchange,提问作者Jatin
相关产品推荐
相关产品推荐

