Что такое токен устройства?
Для отправки push уведомления на IOS устройство нам понадобится его токен. Токен - это уникальная строка для связки аккаунта apple, устройства и приложения для которого будет приходить уведомление.
Пример IOS токена: 4a9cf2a8eb22e1718f7368982870eb950a7367134d2e2b66cbb6b21773600671
Yii расширение для отправки push уведомлений
Для рассылки push уведомлений я не стал изобретать велосипед, а обратился в гугл для поиска расширения под yii. Мой выбор остановился на расширении Yii 1.1: apns-gcm. Скачать его можно с официального сайта расширений для yii: http://www.yiiframework.com/extension/apns-gcm/ или с сайта кодер.укр.
Сертификат для отправки push уведомлений
Перед использованием расширения нам необходимо получить сертификат от IOS программиста. Или сделать его самому, как сгенерировать сертификат можно поискать в гугл. Я получил сертификат от IOS разработчика с расширением p12. В Yii 1.1: apns-gcm расширении нужен pem сертификат, поэтому свой я переконвертировал онлайн, здесь: https://www.sslshopper.com/ssl-converter.html, но можно и попросить IOS разработчика сделать это.
И так сертификат у нас есть, расширение скачали, теперь необходимо его подключить.
Подключаем расширение apns-gcm в yii для отправки push уведомлений
Копируем содержимое архива в папку /protected/extensions/apns-gcm. И подключаем его в файле конфигураций /protected/config/main.php, для этого в components добавляем следующий код:
return array( //... 'components' => array( //... 'apns' => array( 'class' => 'application.extensions.apns-gcm.YiiApns', 'environment' => 'sandbox', 'pemFile' => $_SERVER['DOCUMENT_ROOT'] . '/apnssert/apns-dev.pem', 'dryRun' => false, 'options' => array( 'sendRetryTimes' => 5 ), ), 'gcm' => array( 'class' => 'ext.apns-gcm.YiiGcm', 'apiKey' => '' ), 'apnsGcm' => array( 'class' => 'ext.apns-gcm.YiiApnsGcm', ), //... ), //... );
Где, /apnssert/apns-dev.pem - путь к сертификату.
Верификация токенов, перед отправкой push уведомлений
Если вы будете слишком часто слать уведомления или они будут бесполезные или ... (свой вариант), то пользователь либо отключит уведомления, от приложения, либо удалит приложение вовсе. В обоих случаях нам необходимо удалить токен устройства, т.к. хранить его более нет смысла, уведомления приходить туда все равно не будут.
Для этого перед отправкой push уведомлений необходимо сделать верификацию токенов, т.е. удалить все устаревшие токены. Такую проверку токенов можно сделать 1 раз в сутки. Поэтому либо выполняем ее перед отправкой уведомлений, если вы редко это делаете, либо добавляем в планировщик крон скрипт с верификацией токенов.
Пример кода для проверки и удаления устаревших токенов:
public function actionIosDeleteOldToken() { $apns = Yii::app()->apns; $feedback = new ApnsPHP_Feedback( ApnsPHP_Abstract::ENVIRONMENT_SANDBOX, //ApnsPHP_Abstract::ENVIRONMENT_PRODUCTION, Yii::app()->apns->pemFile ); $feedback->connect(); $deviceTokens = $feedback->receive(); if (!empty($deviceTokens)) { foreach ($deviceTokens as $token) { /** * В ответ мы получим массив следующего формата * ['timestamp'] => 1406040206 * ['tokenLength'] => 32 * ['deviceToken'] => 4a9cf2a8eb22e1718f7368982870eb950a7367134d2e2b66cbb6b21773600671 */ //Здесь выполняем запрос на удаление токена echo 'Удален токен: ' . $token['deviceToken'] . '<br/>'; } } }
Отправка push уведомления
Пример тестовой отправки push уведомления на одно устройство (1 токен):
public function actionIosSendTest($token) { $message = 'Hello! This is a test push notification:)'; //$token - токен устройства $apns = Yii::app()->apns; $apns->send( $token, $message, array( 'customProperty1' => 'При необходимости можно передать дополнительные параметры', 'customProperty2' => 'И еще один дополнительный параметр' ), array( 'sound' => 'default', 'badge' => 1 ) ); }
Массовая отправка push уведомления
Пример отправки одного push уведомления на несколько устройство (несколько токенов):
public function actionIosSendTestMas() { $message = 'Hello! This is a test push notification for all:)'; //Формируем массив токенов $devicesTokens = array('<token1>', '<token2>', 'tokenN'), $apns = Yii::app()->apns; $apns->sendMulti( devicesTokens, $message, array( //Дополнительные параметры ), array( 'sound' => 'default', 'badge' => 1 ) ); }
В ближайшее время напишу о том, как я делал отправку push уведомлений для Android устройств.
Комментарии
Отличная статья по пуш уведомлениям, потратил минимум время на внедрение. А как с Android продвигаются дела? Теперь про нее хочу почитать
ОтветитьПока еще не занимался, но как только сделаю, так сразу напишу)
ОтветитьЧто-то у меня не отправляются нотификации на устройства установленные через тестфлай
ОтветитьНужно заменить 'environment' => 'sandbox' на 'environment' => 'production'
Ответитьreturn array(
'components' => array(
'apns' => array(
'class' => 'application.extensions.apns-gcm.YiiApns',
'environment' => 'production',
Не помогло
ОтветитьПересоздайте сертификат, и при создании разрешите работать на продакшене
ОтветитьПомогло, спасибо
Ответить