Google Cloud Messaging: Библиотека для Codeigniter и пара отличий Google Cloud Messaging и Apple Push Notifications

в 10:39, , рубрики: codeigniter, gcm, Google API, google cloud messaging, php, push, push notifications, метки: , , , , ,

Добрый день, друзья,

Буквально недавно questman написал статью о новом-старом сервисе от Google под названием Google Cloud Messaging и привел пример приложения под android с его использованием.
Со своей колокольни я бы хотел продолжить тему с точки зрения server-side с оглядкой на опыт использования Apple Push Notifications.

Называется новый сервис как уже было упомянуто Google Cloud Messaging (людям сталкивавшимся с этим до 27.06.12 более известный как Cloud To Device Messaging (c2dm) Service ).

Одно из первых заметных отличий — метод аутентификации скрипта отправителя. GCM принимает аутентификацию по API key, в то время как для C2DM нужен был ClientLogin или OAuth.

Сам API Key вы можете получить в консоли — code.google.com/apis/console/:

  1. Создайте проект
  2. Перейдите в Services и выберите «Google Cloud Messaging for Android»
  3. Перейдите в API access и создайте новый Server Key

Как написать само android приложение описал questman, а также можно поискать информацию в доке — developer.android.com/guide/google/gcm/gs.html

Далее, как и в случае с APNs, для отправки уведомления на android устройство вам понадобиться знать его registration id (который играет примерно ту же роль, что и device token в iOS приложении). Этим должен озаботиться разработчик приложения.

В отличие от APNs, Google Cloud Messaging не используются сертификаты.
Адрес для отправки уведомлений только один для development и production: android.googleapis.com/gcm/send
Также у API ключей нет разделения на development и production версии. Зато в настройках ключа жестко прописывается разрешенные ip адреса для отправки уведомлений.

После того, как вы получите registration id и API Key на сервере, вы можете смело начинать отправлять уведомления на устройство.

Снова таки вспоминая APNs, хочется сказать Google спасибо за то, что не нужно возиться с бинарными данными. Данные передаются методом POST в простом текстовом виде, в формате JSON или plain text (это не совсем одно и то же с simple и enhanced форматами в APN, в случае с GCM сервис вернет развернутый ответ в любом случае). Я конечно же рекомендую использовать JSON и сам его использую. Тем более, что отправку уведомлений нескольким адресатам можно реализовать только с его помощью.

Для отправки сообщений нескольким пользователям, достаточно перечислить их registrations ids. Сообщение при этом пишется только раз.

Как и в APNs, в GCM можно передавать дополнительные данные. Размер данных ограничен лишь размером всего уведомления, которое не может быть больше 4096 байта.

Ну и последнее и самое приятное — есть понятные и полные ответы сервиса. GCM в этом случае намного разговорчивее коллеги из Apple. Ошибки отправки могут быть как в http-заголовках, так и конкретно применимо к каждому сообщению/устройству индивидуально.

Все они достаточно подробно описаны в доке developer.android.com/guide/google/gcm/gcm.html

И на последок хотел бы продемонстрировать работу небольшой библиотечки под Codeigniter (в принципе к самому CI она особо не привязана, поэтому миграция ее в отдельный php-класс не составит труда), основанной на коде c2dm package, © 2011 lytsing.org & 2012 thebub.net, измененной под GCM:

// контроллер
public function send_gcm()
{
    // загрузка
    // API key прописывается в настройках
        $this->load->library('gcm');
 
    // Сообщение. Также сообщение может быть добавлено через метод setData(),
    // но если сообщение будет добавлено и через setMessage, и черезе setData(),
    // то добавленное черезе setMessage() будет иметь больший приоритет
        $this->gcm->setMessage('Test message '.date('d.m.Y H:s:i'));
 
    // добавление получаетеля или нескольких
    // снова таки количество получателей ограничено лишь максимальной длинной запроса в 4кбайта
        $this->gcm->addRecepient('RegistrationId');
        $this->gcm->addRecepient('New reg id');
 
    // добавление произвольных данных в запрос
        $this->gcm->setData(array(
            'some_key' => 'some_val'
        ));
 
    // про TTL можно почитать здесь: http://developer.android.com/guide/google/gcm/adv.html#lifetime
    // установка TTL
        $this->gcm->setTtl(500);
    // сброс TTL на значение по умолчанию
        $this->gcm->setTtl(false);
 
    // установка группы сообщений
        $this->gcm->setGroup('Test');
    // сброс группы сообщений по умолчанию
        $this->gcm->setGroup(false);
 
    // отправка
        if ($this->gcm->send())
            echo 'Успешно отправлены все сообщения';
        else
            echo 'Хотя бы одно сообщение не было отправлено';
 
    // статус содержит основное сообщение об ошибке
        print_r($this->gcm->status);

    // статусы каждого сообщения отдельно
        print_r($this->gcm->messagesStatuses);
 
    die(' Закончили.');
}

Саму библиотеку можно традиционно найти на github'е — codeigniter-gcm

Всем спасибо за внимание. Гнилые помидоры приветствуются хотя бы с какими-то объяснениями)

Автор: Anton_Gorodezkiy

* - обязательные к заполнению поля