我做了网络服务,可以使用curl将推送通知发送到ios,
我有待开发的ck.pem文件,其中同时包含cert& RSA私钥,并正确引用它.
但是每次我调用网络服务时,都会遇到相同的错误
卷曲失败:无法使用客户端证书(找不到密钥或密码错误?)
除了使用“ stream_context_create”的替代方案之外,所有相关解决方案均不起作用,但是我想使用curl和idk来解决问题所在.
在我的代码下面找到:
function test_push_to_ios() {
$url = 'https://gateway.sandbox.push.apple.com:2195';
$cert = base_url() . 'backend_includes/ios_cert/ck.pem';
$gcm_ids = array("xxxxxx");
$passphrase = "passphrase";
$message = 'nbad_notification';
$aps = array('alert' => $message, 'sound' => 'default');
$fields = array('device_tokens' => $gcm_ids, 'data' => $message, 'aps' => $aps);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSLCERT, $cert);
//curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $passphrase);
curl_setopt($ch, CURLOPT_SSLKEY, $cert);
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $passphrase);
curl_setopt($ch, CURLOPT_CERTINFO, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
$result = curl_exec($ch);
if ($result === FALSE) {
die('Curl failed: ' . curl_error($ch));
}
curl_close($ch);
echo json_encode($result);
}
解决方法:
我没有仔细阅读您的问题.
您正在尝试通过HTTPS请求将推送通知发送给Apple.那行不通. Apple Push Notifications仅通过TCP协议使用特定的二进制格式.
As a provider you communicate with Apple Push Notification service over a binary interface. This interface is a high-speed, high-capacity interface for providers; it uses a streaming TCP socket design in conjunction with binary content. The binary interface is asynchronous.
您的代码有很多问题:
您似乎将GCM代码与APNS代码混合在一起.
$fields = array(‘device_tokens’=> $gcm_ids,’data’=> $message,’aps’=> $aps);看起来与向Google Cloud Messaging服务器发送消息时的操作类似.但是GCM与APNS完全不同,那么您为什么认为这可行?
您正在发送JSON主体,这与GCM兼容,但是APNS使用二进制格式.虽然发给APNS的二进制消息中的有效负载包含一个编码的JSON字符串(看起来与$aps JSON相似),但是您不能将其打包在另一个JSON中并期望它可以工作.
并且在APNS服务器前添加https://不能使其支持HTTPS,因为它没有实现为支持HTTPS(也不是HTTP).
我建议您使用stream_context,它可以工作.