Google Cloud Messaging: Библиотека для Codeigniter и пара отличий Google Cloud Messaging и Apple 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

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

    Похожие публикации

    Комментарии 10

      +1
      А как иначе получить registration id например по заходу на определенную страницу? Не создавая приложение.
        0
        Похоже я задал глупый вопрос, как я понял этот ID привязан к программе, а она в свою очередь привязана к её создателю, а на создателя уже можно найти меры воздействия, иначе это ж открытое поле для спамеров. Хот с другой стороны есть же я с моим API-KEY и в теории и меня можно прикрыть ежели что.
        Просто вроде глупо создавать приложение только чтобы получить registration id.
          0
          registration id привязан к паре приложение/устройство. Смысл его в том, чтобы сделать доставку сообщений наиболее точной.

          «Просто вроде глупо создавать приложение только чтобы получить registration id.»
          Как правило уведомления — это не ключевое свойство приложения, а только метод уведомить пользователя о том, что произошло что-то связанное с этим приложением, даже если приложение не запущено.
            0
            В теории было бы круто иметь возможность отправить Push на любой девайс, владелец которого подписался на это на определенной странице сайта например.
            Реально сервис сделать такой?
              0
              повторюсь: registration id привязан к паре приложение/устройство. Т.е. чтобы сгенерировать этот id нужно устройство и приложение. Без приложения Google не сгенерирует id.
              Сервис, о котором вы говорите, возможно сделать. Но прежде нужно сделать приложение, которое получит registration id и отправит его вам для дальнейшего использования в рассылке.
              Снова таки, если приложение удалят с устройства, на него больше не будут приходить уведомления.
                0
                Если я правильно понял то registration id генерится из некого ID девайса плюс ID приложения, наверняка есть приложения которые не удаляются из системы за редким исклюением, в теории брать такое приложение плюс ID девайса и генерим registration ID уже на стороне сервера, не взлетит?
                  0
                  Насколько я знаю официально о такой возможности заявлено не было. Так что если это и возможно, то только как хак.
                  Наверняка конечно не отвечу взлетит/не взлетит.
                    0
                    В любом случае, спасибо за ответы.
        0
        Кто в курсе, какая минимальная версия Android?
          0
          GCM requires Android 2.2 or later

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое