Підготовка apple push notification ssl сертифікату, heximal blog

Підготовка Apple Push Notification SSL сертифікату

Підготовка apple push notification ssl сертифікату, heximal blog

Підготовка apple push notification ssl сертифікату, heximal blog

Необхідно створити запит на підпис сертифіката. Робиться це через стандартний додаток OS X, яка називається «Зв'язка ключів» (Keychain). Запускаємо її, і відразу йдемо в меню Зв'язка ключів -> Асистент сертифікації -> Запросити сертифікат у бюро сертифікації.

Підготовка apple push notification ssl сертифікату, heximal blog

Підготовка apple push notification ssl сертифікату, heximal blog

Далі натискаємо Продовжити, вибираємо місце на диску, куди буде збережений файл запиту. Повертаємося в developer portal на сторінку «About creating a Certificate Signin Request (CSR)», натискаємо там Continue, на сторінці, що з'явилася вибираємо наш файл запиту і натискаємо Generate. Трохи подумавши система видає посилання на скачування згенерованого сертифіката, що ми і робимо.

Підготовка apple push notification ssl сертифікату, heximal blog

Система пропонує зберегти файл сертифіката під ім'ям aps_development.cer. Раджу створити окрему папку, куди зберігати все причетне. Вбудовувати його в свою в'язку ключів зовсім не обов'язково
3. Далі необхідно вивантажити особистий ключ. Відкриваємо Зв'язку ключів. знаходимо свій ключ, вибираємо його і через меню вибираємо Файл -> Експортувати Об'єкт.

Підготовка apple push notification ssl сертифікату, heximal blog

Система попросить ввести ключове слово - це пароль для доступу до приватного ключу, що навіть якщо хтось заволодіє експортованих ключем, він їм не зможе скористатися. Запам'ятайте цю фразу, позначимо її як pass1.

Підготовка apple push notification ssl сертифікату, heximal blog

Система запропонує зберегти ключ у файлі з розширенням .p12 (нехай буде KeyName.p12). При цьому ще попросить ввести пароль до зв'язки ключів.

Підготовка apple push notification ssl сертифікату, heximal blog

4. Далі потрібно конвертувати сам сертифікат і ключ в формат PEM (зв'язка ключів вивантажує об'єкти в форматі DER). Не знаю, чим це обумовлено, тільки бібліотека openssl, за допомогою якої ми будемо здійснювати взаємодію з Apple Push Notification Service (apns) в php, набагато охочіше працює з файлами з форматі PEM. Реалізація openssl присутній в більшості * nix-систем, по крайней мере в OS X і FreeBSD вона йде в стандартній комплектації. Відкриваємо вікно терміналу і робимо наступне.

при виконанні другої команди консоль попросить ввести ключову фразу тричі. Перший раз потрібно ввести ту ключову фразу, яку ви вводили при експорті ключа (pass1). Другий і третій раз - нова ключова фраза, з якої буде згенеровано PEM ключ. Будемо умовно її називати pass2. Якщо зробити її такою ж, як pass1 нічого кримінального не буде.

Далі потрібно буде склеїти ці два файли.

і в результаті отримуємо файл apns-dev.pem, який в подальшому і будемо експлуатувати на сервері.
До речі, тут же можна перевірити, що ssl-сертифікат вивантажився / конвертувати коректно. В консолі набираємо

якщо ви тестируете production сертифікат, то замість домену gateway.sandbox.push.apple.com потрібно вказувати gateway.push.apple.com

Якщо все ок, консоль видасть багато-багато тексту.

Далі переносимося на сервер, копіюємо сертифікат apns-dev.pem і створюємо поруч з ним php-скрипт. який буде здійснювати безпосередньо розсилку Push-повідомлень

Тут слід звернути увагу на наступні нюанси.
stream_context_set_option ($ stream_context, 'ssl', 'passphrase', 'pass2');
В цьому місці необхідно прописати ключову фразу pass2 (див. Вище). Інакше openssl буде кожен раз просити ввести її вручну.
$ Payload = preg_replace_callback ( '/ \\\\ u ​​([0-9a-f]) / i',
'Replace_unicode_escape_sequence', $ payload);
це робиться для того, щоб збільшити фактичну довжину повідомлення. Оскільки php функція json_encode перетворює все не-ASCII символи в unicode-суті, що в 5 разів зменшує і так не більшу максимальну довжину Push-повідомлення (256 символів).

Звичайно вся інша бізнес-логіка може бути інший, наприклад, список push-токенів не у вигляді константного масиву $ device_tokens. Цей шматок коду чисто для нагадування принципів роботи саме з openssl в php і відправкою push-повідомлень.

Якщо все це вийшло, потрібно буде все те ж саме зробити для Production сертифіката. перш ніж публікувати додаток.

1) За відправку повідомлень з php, ви не робите перевірку на помилки. У Apple є розширений протокол, який повертає код у разі виникнення помилки. Чим це погано? Припустимо у вас в базі є токени пристроїв, і один з них не дійсний. При відправці на такий пристрій з'єднання буде закрито без попередження. А ви в циклі продовжуєте слати на інші пристрої. Виходить, що ви шлете повідомлення які на частину пристроїв не дійдуть і ви не впізнаєте в який момент з'єднання було закрито. Так само ви не дізнаєтеся причину