Архив за месяц: Сентябрь 2015

Отправка Push-уведомлений для iOS на PHP

Нужно было отправлять уведомления на iOS устройства. Мануалов и библиотек для этого море, но большинство из них перегружено. Поэтому решил написать сам. Посмотрел пару мануалов и библиотек и написал. Написал, а не работает!

Вроде все правильно, ошибиться-то сложно. Винил сертификат, винил токен. Начал копировать чужие примеры из статей и запускать их. Эффект тот же. В итоге попал примерно на такой пример:

$deviceToken = '7302abdc93d5f8c05e78b10b6c3b6a36b3bffb9dce551164000ddffd1fd23ead';
$certPath = __DIR__ . '/push_production.pem';

$message = 'Hello Dmitry';
$badge = 3;
$sound = 'default';

$payload = array();
$payload['aps'] = array('alert' => $message, 'badge' => (int) $badge, 'sound' => $sound);
$payload = json_encode($payload);

$apns_url = 'gateway.push.apple.com';
$apns_cert = $certPath;
$apns_port = 2195;

$stream_context = stream_context_create();
stream_context_set_option($stream_context, 'ssl', 'local_cert', $apns_cert);

$apns = stream_socket_client('ssl://' . $apns_url . ':' . $apns_port, $error, $error_string, 2, STREAM_CLIENT_CONNECT, $stream_context);

$apns_message = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;
fwrite($apns, $apns_message);

@socket_close($apns);
@fclose($apns);

К сожалению, сейчас не могу вспомнить, где взял его. Отличие от оригинала тут совсем небольшое.

Запустил — пришло уведомление. Вроде код тот же, что и везде, а потом обратил внимание на упаковку сообщения.  В общем, для тех, кто мучается с той же проблемой, вот решение :) За кусок кода не бейте, пожалуйста, он не мой :)