- klen.github.io
- Введение
- Подготовка к работе
- Получение токена для сервера
- Отправка Push уведомлений
- Интеграция с Django
- Создание сервера push-уведомлений для устройств Android
- Требования
- Что такое push-уведомления?
- 1: Создание проекта Google API
- 2: Включение Google Cloud Messaging
- 3: Настройка приложения Android
- 4: Развертывание сервера
- 5: Создание простого сервера Python GCM
- 6: Рассылка Push-уведомлений
- Устранение неполадок
- Заключение
- Как начать работу с Push-уведомлениями на Android
- Введение
- Зачем использовать Google Cloud Messaging?
- Предпосылки
- 1. Настройка проекта Android Studio
- Шаг 1: добавьте зависимости
- Шаг 2: обновите манифест
- 2. Получите ключ API сервера и идентификатор отправителя
- 3. Регистрация клиента
- Шаг 1. Создание службы регистрации
- Шаг 2. Создание службы InstanceIDListenerService
- Шаг 3: Запуск службы регистрации
- 4. Отображение Push-уведомлений
- 5. Добавление значков Push Notification
- 6. Запуск приложения для Android
- 7. Отправка Push-уведомлений
- Шаг 1. Создание сценария
- Шаг 2. Запуск сценария
- Заключение
klen.github.io
Статьи по теме
Настало время рассказать, как реализовать серверную поддержку Push уведомлений для Android. Эта возможность появилась в мобильной системе начиная с версии 2.2 (API8). Ниже я рассмотрю реализацию на Python, но для программиста владеющего другими языками, не должно составить труда справиться самостоятельно.
Введение
Эта простая схема описывает работу с C2DM сервисом. Ваше Android приложение (APP) регистрируется в C2DM сервисе (например при запуске) и отправляет полученный регистрационный код серверу (APP SERVER).
Теперь сервер (APP SERVER) используя полученный регистрационный код и специальный токен может сформировать специальный HTTP-запрос сервису C2DM, который в свою очередь отправит Push сообщение устройству на котором запущена ваша программа.
По-умолчанию в C2DM установлена квота на отсылку не более 200000 уведомлений в день. http://code.google.com/android/c2dm/quotas.html
Подготовка к работе
Для начала необходимо зарегистрировать ваше приложение в C2DM по адресу: http://code.google.com/android/c2dm/signup.html
Вам потребуется указать ваш действующий Google-аккаунт и доменное имя вашего приложения. Вы должны получить на почту письмо с подтверждением. После регистрации вашему приложению будет добавлена возможность получать Push-уведомления с учетом действующих в C2DM квот.
Настройка поддержки Push уведомлений на стороне приложения в данной статье не рассматривается. Вы можете изучить например эту статью: C2DM Написание Android клиента
Получение токена для сервера
Получение авторизационного токена для сервера подробно рассматривается в документации: ClientLogin for Installed Applications. Резюмируя данный документ: для получения токена, нам надо сформировать POST запрос со следующими параметрами:
accountType | HOSTED_OR_GOOGLE |
our@email.here (email аккаунта регистрировавшего C2DM) | |
Passwd | our_password_here (пароль) |
service | ac2dm |
source | our.app идентификатор для логирования (например доменное имя) |
Сделать это можно например используя Curl (Замените ACCOUNT, PASSWORD, SOURCE на ваши реквизиты):
В третьей строке Auth=. и будет ваш искомый токен. Сохраните его в надежном месте.
Отправка Push уведомлений
Отправка уведомлений описана в разделе: How the Application Server Sends Messages. Поддерживаются следующие параметры:
registration_id | Ключ регистрации, полученный приложением от C2DM и переданный серверу приложений |
collapse_key | Название группы сообщений. |
Authorization: GoogleLogin auth= | Токен авторизации (передается в заголовке) |
data. | Набор дополнительных данных в формате key-value |
delay_while_idle | Флаг отложенной доставки. Сообщение может быть доставлено позже. |
Этих данных достаточно, чтобы написать простой код (для работы с HTTP я использую замечательную библиотеку Requests):
Теперь отправлять нотификации можно так:
Интеграция с Django
При интеграции с Django проектом стоит подумать об асинхронности запросов в C2DM.
Асинхронность достигается использованием Celery.
Мысли на будущее: отключение недействительных устройств, массовые рассылки и проверка доставки.
Источник
Создание сервера push-уведомлений для устройств Android
Push-уведомления позволяют приложениям Android сообщать пользователю о событиях, даже если пользователь не использует приложение. Целью данного руководства является настройка рассылки простых push-уведомлений приложения. Для достижения этой цели используются Ubuntu 14.04 и Python 2.7, а также Google Cloud Messaging в качестве сервиса push-уведомлений.
Требования
Чтобы следовать руководству, нужны:
- Приложение Android (полезную информацию можно найти на сайте проекта);
- Выделенный сервер Ubuntu 14.04;
- IP-адрес виртуального выделенного сервера.
Что такое push-уведомления?
Предоставляемые Google серверы соединения GCM принимают сообщения от стороннего сервера приложений (например, от виртуального выделенного сервера), и передают эти сообщения приложениям Android с поддержкой GCM (то есть, клиентскому приложению). В настоящее время Google предоставляет такие серверы соединения для HTTP и XMPP.
Другими словами, для отправки push-уведомлений виртуальный выделенный сервер должен взаимодействовать с сервером Google. Выделенный сервер отправляет сообщение на сервер GCM (Google Cloud Messaging), затем последний ставит в очередь и запоминает сообщение, после чего отправляет его на устройство Android, когда оно находится в режиме онлайн.
1: Создание проекта Google API
Чтобы включить поддержку GCM, нужно для нала создать проект Google API:
Откройте консоль Google Developers Console. При этом будет предложено указать некоторую информацию.
Нажмите кнопку Create Project. Укажите имя проекта, а затем нажмите Create.
Создание нового проекта займет несколько секунд. Обратите внимание на Project ID и Project Number в верхней части экрана.
Запишите Project Number – он еще пригодится при настройке клиента приложения Android.
2: Включение Google Cloud Messaging
Убедитесь, что в Google Developers Console все еще выбран только что созданный проект. В левой панели выберите APIs & auth, затем – APIs.
В появившемся списке интерфейсов включите тумблер Google Cloud Messaging for Android и примите условия обслуживания.
Теперь Google Cloud Messaging for Android появится в списке включенных API данного проекта.
Снова выберите APIs & auth в левом меню, затем – Credentials.
Под Public API access нажмите на Create new Key и выберите Server key. Укажите IP-адрес сервера. Затем нажмите кнопку Create. Скопируйте API KEY – позже его нужно будет ввести на вашем сервере.
3: Настройка приложения Android
Чтобы протестировать отправку push-уведомлений, нужно соединить приложение Android с только что созданным проектом Google API.
Примечание: пользователи, недостаточно хорошо знакомые с разработкой приложений Android, могут обратиться к официальному руководству по созданию клиента GCM.
Официальный исходный код можно загрузить со страницы gcm.
Имейте в виду, исходный код не является обновлением, потому нужно отредактировать файл Gradle:
В main activity поместите строку:
String SENDER_ID = «YOUR_PROJECT_NUMBER_HERE»;
Замените выделенную фразу значением Project Number проекта Google API.
При регистрации устройства на GCM оно получает регистрационный ID, который пригодится для дальнейшей проверки. Чтобы получить его, просто измените эти строки в основном файле:
Поле запуска приложения откройте logcat и скопируйте regid, который выглядит примерно так:
=======================================
10-04 17:21:07.102 7550-7550/com.pushnotificationsapp.app E/==========================﹕ APA91bHDRCRNIGHpOfxivgwQt6ZFK3isuW4aTUOFwMI9qJ6MGDpC3MlOWHtEoe8k6PAKo0H_g2gXhETDO1dDKKxgP5LGulZQxTeNZSwva7tsIL3pvfNksgl0wu1xGbHyQxp2CexeZDKEzvugwyB5hywqvT1-UJY0KNqpL4EUXTWOm0RxccxpMk
10-04 17:21:07.102 7550-7550/com.pushnotificationsapp.app E/==========================﹕ =======================================
4: Развертывание сервера
Разверните сервер Ubuntu 14.04, который будет использоваться в качестве стороннего сервера приложений.
Как уже говорилось, серверы GCM принимают сообщения от стороннего сервера приложений (в данном случае – от выделенного сервера Ubuntu 14.04) и отправляют их приложениям Android. Google предоставляет серверы для HTTP и CCS (XMPP); данное руководство сфокусировано на HTTP.
- взаимодействует с клиентом;
- отправляет правильно отформатированные запросы серверу GCM;
- обрабатывает запросы и пересылает их по мере необходимости с помощью экспоненциального отката;
- хранит ключ API и идентификаторы регистрации клиента. Ключ API включен в заголовок POST-запросов, которые отправляют сообщения;
- создает уникальные идентификаторы для каждого отправляемого сообщения.
Клиент будет взаимодействовать с сервером, отправляя регистрационный номер устройства (который нужно хранить и использовать при отправке уведомления). Управлять клиентом очень просто; кроме того, GCM поможет в этом, отправляя сообщения об ошибках, в случае если регистрационный ID является недействительным.
5: Создание простого сервера Python GCM
Войдите на сервер как пользователь с расширенными привилегиями. Обновите список пакетов:
sudo apt-get update
Установите пакеты Python:
sudo apt-get install python-pip python-dev build-essential
Установите python-gcm (подробнее здесь):
sudo pip install python-gcm
Создайте новый файл Python в любой удобной точке системы, например:
Внесите следующую информацию в файл, заменив значения, выделенные красным (разбор конфигураций можно найти ниже):
from gcm import *
gcm = GCM(» AIzaSyDejSxmynqJzzBdyrCS-IqMhp0BxiGWL1M «)
data = <'the_message': 'You have x new friends', 'param2': 'value2'>
reg_id = ‘ APA91bHDRCRNIGHpOfxivgwQt6ZFK3isuW4aTUOFwMI9qJ6MGDpC3MlOWHtEoe8k6PAKo0H_g2gXhETDO1dDKKxgP5LGulZQxTeNZSwva7tsIL3pvfNksgl0wu1xGbHyQxp2CexeZDKEzvugwyB5hywqvT1-UxxxqpL4EUXTWOm0RXE5CrpMk ‘
gcm.plaintext_request(registration_id=reg_id, data=data)
Данные конфигурации выполняют следующее:
- from gcm import *: импортирует клиента Python в Google Cloud Messaging.
- gcm: в эту строку нужно внести API KEY проекта Google API; убедитесь, что IP сервера разрешен.
- reg_id: укажите regid приложения Android.
6: Рассылка Push-уведомлений
Запустите следующую команду, чтобы выполнить тестовую отправку уведомления:
Это займет около 10 секунд. Устройство Android должно получить уведомление.
Устранение неполадок
Если уведомление не пришло на устройство в течение 10 секунд, проверьте:
- подключен ли смартфон/планшет к интернету;
- правильно ли указан ключ проекта;
- правильно ли указан regid приложения;
- внесен ли IP в ключ Google API;
- подключен ли сервер к интернету.
Если даже после этого уведомление не приходит, вероятно, проблема в приложении. Проверьте logcat на наличие ошибок.
Заключение
Протестировав рассылку push-уведомлений, можете разослать их всем пользователям приложения.
Примечание: если CGM сообщает «invalid ID», удалите его из базы данных.
Источник
Как начать работу с Push-уведомлениями на Android
Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)
Введение
Получение пользователей для установки вашего приложения — это только половина битвы. Получение их для регулярного использования — это другая половина. Вполне возможно, что ваши пользователи полностью забывают о вашем приложении после использования его только один или два раза. Что со всеми другими новыми приложениями, конкурирующими за их внимание.
Используя push-уведомления, вы можете время от времени напоминать пользователям о своем приложении, повышая вероятность того, что ваше приложение останется на их устройствах.
Google Cloud Messaging, GCM для краткости — это бесплатный сервис, который вы можете использовать для отправки push-уведомлений вашим пользователям. В этом уроке вы узнаете, как использовать его для создания приложения для Android, которое может получать push-уведомления, и простой Python скрипт на стороне сервера, который может их генерировать и отправлять.
Зачем использовать Google Cloud Messaging?
Для большинства клиент-серверных сообщений клиент инициирует запросы на получение данных с сервера. Другими словами, клиент извлекает данные с сервера. В случае push-уведомлений, однако, это сервер, инициирующий передачу данных.
Обычно это достигается за счет поддержания постоянного TCP/IP-соединения — соединения, которое остается постоянно открытым между сервером и клиентом. Это может показаться замечательным, но если у вас популярное приложение, поддержка тысяч постоянных соединений между вашим сервером и устройствами ваших пользователей может быть очень дорогостоящим.
Google Cloud Messaging — это служба, которая решает эту проблему, выступая в качестве посредника между вашим сервером и устройством вашего пользователя. С помощью GCM Google’s Cloud Connection Server, часто называемый CCS, управляет постоянными подключениями для вас. Он также обеспечивает надежную доставку ваших push-уведомлений.
Предпосылки
Чтобы следовать за мной, вам нужно:
- Последняя версия Android Studio
- Python 2.7.6 или выше
- Устройство под управлением Android 4.4 или выше с установленными сервисами Google Play
1. Настройка проекта Android Studio
Запустите Android Studio и создайте новый проект с пустой Activity . Если вы использовали значения по умолчанию, проект должен включать класс Java в MainActivity.java.
Шаг 1: добавьте зависимости
В этом проекте мы будем использовать Google Services gradle plugin для настройки GCM. Включите его в проект, добавив следующую строку в раздел dependencies в build.gradle проекта:
Затем примените плагин в модуле app build.gradle:
Чтобы иметь возможность использовать API GCM, добавьте com.google.android.gms: play-services Как compile зависимость в том же файле:
Если вы нажмете кнопку «Синхронизировать сейчас», вы увидите следующую ошибку:
Чтобы исправить ошибку, нажмите ссылку «Установить репозиторий и синхронизировать проект».
Шаг 2: обновите манифест
Внутри файла AndroidManifest.xml проекта создайте и используйте специальное разрешение C2D_MESSAGE на основе имени пакета вашего проекта. Убедитесь, что для параметра ProtectionLevel установлено разрешение в значение signature.
Уведомления поступают в виде трансляций. Для обработки этих трансляций нашему приложению требуется BroadcastReceiver . Однако нам не нужно создавать его вручную. Вместо этого мы можем использовать класс GcmReceiver как BroadcastReceiver .
У BroadcastReceiver должен быть intent-filter , который отвечает на действие com.google.android.c2dm.intent.RECEIVE , а имя его category должно соответствовать имени пакета вашего проекта. Добавьте в манифест следующий код:
2. Получите ключ API сервера и идентификатор отправителя
При общении с сервером облачных соединений нам необходимо идентифицировать себя с помощью ключа API на стороне сервера и идентификатора отправителя на стороне клиента. Чтобы получить ключ API и идентификатор отправителя, создайте новый проект в консоли разработчика.
Начните с нажатия кнопки «Выбрать платформу». Затем нажмите кнопку «Включить службы для моего приложения Android App». Когда вы это сделаете, вас попросят указать ваше имя и имя пакета Android для вашего приложения. Убедитесь, что указанное вами имя пакета Android соответствует имени пакета, которое вы ввели при создании проекта Android Studio.
Затем нажмите кнопку «Выбрать и настроить службы» внизу. Теперь вы можете выбрать сервисы Google, которые хотите добавить в приложение.
На данный момент нажмите кнопку «Облачные сообщения», а затем нажмите «Включить облачные сообщения Google». Через несколько секунд вам будет предоставлен ключ API сервера и идентификатор отправителя. Запишите ключ API сервера и нажмите «Закрыть».
Плагин Google Services, который мы добавили ранее, требует правильной работы файла конфигурации. Создайте файл, нажав кнопку «Создать конфигурационные файлы».
После того, как файл был сгенерирован, загрузите его и поместите в каталог app проекта Android Studio.
3. Регистрация клиента
GCM идентифицирует устройства Android с помощью токенов регистрации. Поэтому наше приложение должно иметь возможность регистрироваться на каждом Android-устройстве, на котором оно установлено.
Шаг 1. Создание службы регистрации
Регистрация должна выполняться в фоновом потоке, потому что процесс может занять некоторое время в зависимости от сетевого подключения. Поскольку регистрация не требует каких-либо входных данных от пользователя, IntentService идеально подходит для этой задачи.
Создайте новый класс Java под названием RegistrationService.java, сделайте его подклассом IntentService и переопределите его метод onHandleIntent .
Внутри метода onHandleIntent мы можем использовать API идентификатора экземпляра для создания или получения регистрационного токена. Во-первых, создайте экземпляр класса InstanceID , используя его метод getInstance .
Теперь мы можем использовать метод getToken объекта InstanceID для получения регистрационного токена в виде String . GetToken ожидает идентификатор отправителя как один из его аргументов. Поскольку мы добавили файл google-services.json в наш проект, мы можем передать идентификатор отправителя методу, используя R.string.gcm_defaultSenderID .
Если вы хотите видеть содержимое токена регистрации для целей отладки, вы можете зарегистрировать его как отладочное сообщение, используя метод Log.d .
На этом этапе вы можете отправить токен регистрации на свой веб-сервер и сохранить его в базе данных. Однако вам не нужно это делать, если вы не планируете обращаться к своим пользователям по отдельности. Если вы планируете отправлять одно и то же сообщение каждому пользователю, вы должны следовать принципу публикации подписки.
Теперь я покажу вам, как подписаться на topic под названием my_little_topic. Требуется всего две строки кода. Сначала создайте новый экземпляр класса GcmPubSub , используя его метод getInstance . Затем вызовите его метод subscribe и передайте ему токен регистрации вместе с названием темы.
Теперь наше приложение может получать каждое push-уведомление, опубликованное в my_little_topic.
Наконец, определите службу в AndroidManifest.xml.
Служба регистрации завершена.
Шаг 2. Создание службы InstanceIDListenerService
Токены регистрации периодически обновляются. Следовательно, каждое приложение для Android, использующее GCM, должно иметь InstanceIDListenerService , который может обрабатывать эти обновления. Поэтому создайте новый файл Java под названием TokenRefreshListenerService.java и сделайте его подклассом InstanceIDListenerService . Внутри метода onTokenRefresh этого класса все, что нам нужно сделать, это просто начать процесс регистрации снова, запустив службу регистрации с использованием метода Intent и startService .
Добавьте следующий код в TokenRefreshListenerService.java:
Эта служба должна иметь возможность реагировать на действие com.google.android.gms.iid.InstanceID . Поэтому, определяя службу в AndroidManifest.xml, добавьте соответствующий intent-filter .
Шаг 3: Запуск службы регистрации
Чтобы процесс регистрации начался сразу после запуска приложения, мы должны запустить класс RegistrationService внутри метода onCreate у MainActivity . Для этого создайте для него Intent и используйте метод startService .
4. Отображение Push-уведомлений
GCM автоматически отображает push-уведомления в лоток уведомлений, как только они будут получены. Однако он делает это только в том случае, если связанное приложение содержит GCMListenerService .
Создайте новый класс Java с именем NotificationsListenerService и сделайте его подклассом GCMListenerService . Если вы не хотите обрабатывать вставленные данные самостоятельно, вам не нужно писать код внутри этого класса. Мы можем оставить этот класс пустым.
Определяя службу в AndroidManifest.xml, убедитесь, что вы добавили intent-filter , который позволяет ему отвечать на com.google.android.c2dm.intent.RECEIVE .
5. Добавление значков Push Notification
У каждого push-уведомления должен быть связанный с ним значок. Если у вас нет такой возможности, вы можете получить ее в Material Design Icons Library.
Как только вы загрузите значок, поместите его в папку res вашего проекта. Я буду использовать ic_cloud_white_48dp в качестве значка.
6. Запуск приложения для Android
Теперь наше Android-приложение завершено. После того, как вы скомпилируете его и запустите на Android-устройстве, вы сможете увидеть маркер регистрации в логах logcat.
Нажмите кнопку «Назад» на устройстве, чтобы выйти из приложения. Это необходимо, потому что GCM автоматически отображает push-уведомления только в том случае, если пользователь не использует приложение. Если вы хотите, чтобы уведомления отображались даже в том случае, когда приложение запущено, вам нужно будет создать уведомления самостоятельно в NotificationsListenerService с помощью класса Notification.Builder .
7. Отправка Push-уведомлений
В заключительной части этого учебника мы создадим простой Python скрипт, который может генерировать и отправлять push-уведомления всем устройствам Android, на которых установлено наше приложение.
Вы можете запустить этот скрипт с локального компьютера или с удаленного веб-сервера, к которому у вас есть доступ к SSH.
Шаг 1. Создание сценария
Создайте новый файл с именем send.py и откройте его, используя ваш любимый текстовый редактор.
В верхней части файла импортируйте модули urllib2 и urllib . Мы будем использовать эти модули для отправки данных на Google Cloud Connection Server. Импортируйте модуль json , потому что отправляемые данные должны быть действительными JSON. Наконец, чтобы получить доступ к аргументам командной строки, импортируйте модуль sys .
Затем создайте переменную, в которой хранится ключ API сервера, который вы записали ранее. Ключ должен быть частью каждого HTTP-запроса, который мы делаем в CCS.
Каждое уведомление должно иметь название и тело. Вместо жесткого кодирования в нашем скрипте давайте примем название и тело как аргументы командной строки, используя массив argv .
Создайте новый словарь Python для представления данных, которые должны быть отправлены в CCS. Чтобы наше приложение для Android могло получать уведомление, оно должно быть опубликовано в тему my_little_topic. Поэтому добавьте ключ to в словарь, и установите его значение в /themes/my_little_topic.
Чтобы представить содержимое уведомления, добавьте ключ, называемый notification в словарь, и установите его значение для другого словарного объекта, содержащего три ключа:
- body
- title
- icon
Убедитесь, что значение icon совпадает с именем значка, который можно использовать в вашем проекте Android.
Преобразуйте словарь в строку JSON, используя функцию dumps модуля json :
Все, что нам нужно сделать, это отправить строку JSON на https://gcm-http.googleapis.com/gcm/send. Для этого создайте новый объект Request и установите dataAsJSON в качестве своих данных. Затем установите заголовок Authorization в MY_API_KEY и заголовок Content-type в application/json.
Наконец, чтобы выполнить запрос и получить ответ, передайте объект запроса функции urlopen и вызовите его метод read .
Теперь скрипт Python завершен и готов к использованию.
Шаг 2. Запуск сценария
На этом этапе мы готовы отправить push-уведомления всем устройствам, на которых установлено наше приложение. Откройте терминал и введите каталог, в котором вы создали send.py.
Передайте имя сценария исполняемому файлу python вместе со строкой для заголовка уведомления, а другое — для тела уведомления. Вот пример, который вы можете использовать:
Если ошибок нет, вы должны получить ответ, который выглядит так:
Если вы проверите свое Android-устройство, вы увидите новое уведомление в лотке уведомлений.
Заключение
Теперь вы знаете, как отправлять push-уведомления своим пользователям. На этом занятии вы узнали, как создать Android-приложение, способное регистрироваться и получать уведомления, публикуемые по определенной теме. Вы также узнали, как создать скрипт Python, который может публиковать уведомления.
Несмотря на то, что push-уведомления могут показаться отличным способом общения с вашими пользователями, я предлагаю вам использовать их экономно и только если у вас есть что-то полезное, потому что слишком много слишком часто — это, пожалуй, самый быстрый способ чтобы ваше приложение оказалось удаленным.
Чтобы узнать больше о облачных сообщениях Google, см. Руководство по облачным сообщениям.
Источник