Codeigniter библиотека для отправки сообщений через Google Cloud Messaging (GCM) или Как отправить Push Notifications на android из php

Fork me on GitHub

Не так давно я затрагивал тему Push Notifications (уведомлений для мобильных устройств) от Apple.

Сегодня пришло время несколько распараллелить тему в контексте Google и Android, потому что для своих google-фонов Корпорация добра тоже создала возможность рассылки уведомлений. Называется этот сервис Google Cloud Messaging (людям сталкивавшимся с этим до 27.06.12 более известный как Cloud To Device Messaging (c2dm) Service ).

О нем и пойдет речь далее. Также будут упомянуты различия и сходства между GCM и APNs.

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

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

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

Этот ключ понадобиться не только для отправки сообщений с сервера, но и при регистрации приложения на устройстве для получения уведомлений.

Само android приложение я еще пока не писал, но как это сделать видимо объяснено в доке — http://developer.android.com/guide/google/gcm/gs.html

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

В отличие от APNs, Google Cloud Messaging не используются сертификаты.

Также у API ключей нет разделения на development и production версии. Зато в настройках ключа жестко прописывается разрешенные ip адреса для отправки уведомлений.

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

Снова таки вспоминая APNs, хочется сказать гуглу спасибо за то, что не нужно возиться с бинарными данными. Данные передаются методом POST в простом текстовом виде, в формате JSON или plain text. Я конечно же рекомендую использовать JSON и сам его использую.

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

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

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

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

И на последок хотел бы продемонстрировать работу небольшой библиотечки, основанной на коде c2dm package, (c) 2011 lytsing.org & 2012 thebub.net, измененной мной под GCM:

// controller
public function send_gcm()
{
    // simple loading
    // note: you have to specify API key in config before
        $this->load->library('gcm');

    // simple adding message. You can also add message in the data,
    // but if you specified it with setMesage() already
    // then setMessage's messages will have bigger priority
        $this->gcm->setMessage('Test message '.date('d.m.Y H:s:i'));

    // add recepient or few
        $this->gcm->addRecepient('RegistrationId');
        $this->gcm->addRecepient('New reg id');

    // set additional data
        $this->gcm->setData(array(
            'some_key' => 'some_val'
        ));

    // also you can add time to live
        $this->gcm->setTtl(500);
    // and unset in further
        $this->gcm->setTtl(false);

    // set group for messages if needed
        $this->gcm->setGroup('Test');
    // or set to default
        $this->gcm->setGroup(false);

    // then send
        if ($this->gcm->send())
            echo 'Success for all messages';
        else
            echo 'Some messages have errors';

    // and see responses for more info
        print_r($this->gcm->status);
        print_r($this->gcm->messagesStatuses);

    die(' Worked.');
}

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

 

Полезно(0)Бесполезно(1)

Добавить комментарий