使用curl进行ios推送通知的php代码点火器

使用curl进行ios推送通知的php代码点火器,php,ios,codeigniter,curl,apple-push-notifications,Php,Ios,Codeigniter,Curl,Apple Push Notifications,我已经创建了一个web服务,可以使用curl向ios发送推送通知, 我有用于开发的ck.pem文件,其中包含cert和RSA私钥,并正确引用它 但每次我调用web服务时,都会出现相同的错误 Curl失败:无法使用客户端证书(未找到密钥或密码短语错误?) 除了使用“stream\u context\u create”的替代方案之外,所有相关的解决方案都不起作用,但我想用curl和idk来解决这个问题 在下面找到我的代码: function test_push_to_ios() { $url

我已经创建了一个web服务,可以使用curl向ios发送推送通知, 我有用于开发的ck.pem文件,其中包含cert和RSA私钥,并正确引用它

但每次我调用web服务时,都会出现相同的错误 Curl失败:无法使用客户端证书(未找到密钥或密码短语错误?)

除了使用“stream\u context\u 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推送通知仅适用于TCP协议上的特定二进制格式

作为提供商,您可以通过二进制接口与Apple推送通知服务进行通信。该接口是一个面向提供商的高速、高容量接口;它结合二进制内容使用流式TCP套接字设计。二进制接口是异步的

您的代码存在许多问题:

您似乎混合了GCM代码和APNS代码。
$fields=array('device\u tokens'=>$gcm\u id,'data'=>$message,'aps'=>$aps)
看起来与向Google云消息服务器发送消息时的操作类似。但是GCM和APN完全不同,所以为什么你认为这会起作用呢

您发送的是一个JSON正文,它与GCM一起工作,但APN使用二进制格式。虽然发送给APNS的二进制消息中的有效负载包含一个编码的JSON字符串(看起来类似于您的
$aps
JSON),但您不能将其打包到另一个JSON中并期望它工作

在APNS服务器前面添加
https://
无法使其支持https,因为它的实现不支持https(也不支持HTTP)


我建议您使用
stream\u context
,这很管用。

不,我得到了带有证书和密钥的.pem文件,我尝试了使用stream\u context的其他示例,结果很管用。idk为什么不能使用curl,你试过我的代码了吗?@aemad我错了。我完全改变了我的答案。谢谢你提供的有用信息,虽然我不能让它工作,但我知道为什么