Добрый день, друзья,
Буквально недавно 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/:
- Создайте проект
- Перейдите в Services и выберите «Google Cloud Messaging for Android»
- Перейдите в 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