PHP code igniter с использованием curl для iOS push-уведомлений



Я создал веб-сервис для отправки push-уведомлений на ios с помощью curl,
у меня есть 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);
}
748   1  

1 ответ:

Я не очень внимательно прочитал Ваш вопрос.

Вы пытаетесь отправить push-уведомления Apple через HTTPS-запрос. Это не сработает. Push-уведомления Apple работают только с определенным двоичным форматом по протоколу TCP.

Как поставщик вы общаетесь с Apple Push Notification service через двоичный интерфейс. Этот интерфейс является высокоскоростным, высокопроизводительным интерфейсом для провайдеров; он использует потоковый TCP-сокет в сочетании с бинарным контентом. Двоичный код интерфейс асинхронный.

Существует много проблем с вашим кодом:

Вы, кажется, смешиваете код GCM с кодом APNS. $fields = array('device_tokens' => $gcm_ids, 'data' => $message, 'aps' => $aps); выглядит примерно так же, как при отправке сообщения на сервер Google Cloud Messaging server. Но GCM полностью отличается от APNS, так почему же вы думали, что это сработает?

Вы посылаете тело JSON, которое работает с GCM, но APNS использует двоичный формат. В то время как полезная нагрузка внутри двоичного сообщения для APNS содержит кодированный JSON Строка (которая похожа на ваш $aps JSON), вы не можете упаковать ее в другой JSON и ожидать, что она будет работать.

И добавление https:// перед сервером APNS не может заставить его поддерживать HTTPS, так как он не был реализован для поддержки HTTPS (ни HTTP).

Я предлагаю вам использовать stream_context, который работает.

Comments

    Ничего не найдено.