PHP代码点火器使用curl为iOS推送通知

我做了网络服务,可以使用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,它可以工作.

上一篇:满足以下要求的PHP / MySQL查询应该是什么?


下一篇:使用POI 导出Excel 动态合并单元格