Что такое токен устройства?

Для отправки 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 устройств.