Вступление
Заставить пользователей установить ваше приложение — это только полдела. Получение их, чтобы использовать это регулярно — другая половина. Вполне возможно, что ваши пользователи полностью забудут о вашем приложении после его использования только один или два раза. Что со всеми другими новыми приложениями, конкурирующими за их внимание.
Используя push-уведомления, вы можете время от времени напоминать пользователям о вашем приложении, увеличивая вероятность того, что ваше приложение останется установленным на их устройствах.
Google Cloud Messaging , сокращенно GCM, — это бесплатная услуга, которую вы можете использовать для отправки push-уведомлений своим пользователям. В этом руководстве вы узнаете, как использовать его для создания приложения Android, которое может получать push-уведомления, и простого сценария Python на стороне сервера, который может генерировать и отправлять их.
Зачем использовать Google Cloud Messaging?
Для большинства соединений клиент-сервер клиент инициирует запросы на получение данных с сервера. Другими словами, клиент извлекает данные с сервера. Однако в случае push-уведомлений именно сервер инициирует передачу данных.
Обычно это достигается путем поддержания постоянного соединения TCP / IP — соединения, которое остается открытым в течение неопределенного времени — между сервером и клиентом. Это может звучать замечательно, но если у вас есть популярное приложение, поддержание тысяч постоянных соединений между вашим сервером и устройствами ваших пользователей может быть очень дорогим.
Google Cloud Messaging — это служба, которая решает эту проблему, выступая в качестве посредника между вашим сервером и устройством вашего пользователя. С GCM облачный сервер соединений Google, часто называемый 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 для настройки GCM. Включите его в проект, добавив следующую строку в разделе dependencies
в build.gradle проекта:
groovy classpath 'com.google.gms:google-services:1.5.0'
Затем примените плагин в build.gradle модуля приложения :
groovy apply plugin: 'com.google.gms.google-services'
Чтобы иметь возможность использовать API GCM, добавьте com.google.android.gms:play-services
в качестве зависимости compile
в тот же файл:
groovy compile "com.google.android.gms:play-services:8.3.0"
Если вы нажмете кнопку « Синхронизировать сейчас» , вы увидите следующую ошибку:
Нажмите на ссылку Установить репозиторий и синхронизируйте проект, чтобы исправить ошибку.
Шаг 2. Обновите манифест
В файле AndroidManifest.xml проекта создайте и используйте настраиваемое разрешение C2D_MESSAGE на основе имени пакета вашего проекта. Убедитесь, что уровень protectionLevel
для разрешения установлен на подпись .
« `XML
« `
Уведомления принимаются в виде трансляций. Для обработки этих трансляций нашему приложению необходим BroadcastReceiver
. Однако нам не нужно создавать его вручную. Вместо этого мы можем использовать класс GcmReceiver
в качестве BroadcastReceiver
.
BroadcastReceiver
должен иметь intent-filter
который реагирует на действие com.google.android.c2dm.intent.RECEIVE
а имя его category
должно совпадать с именем пакета вашего проекта. Добавьте следующий код в манифест:
« `XML
« `
2. Получить ключ API сервера и идентификатор отправителя
Во время связи с сервером облачных подключений нам необходимо идентифицировать себя, используя ключ API на стороне сервера и идентификатор отправителя на стороне клиента. Чтобы получить ключ API и идентификатор отправителя, создайте новый проект в консоли разработчика.
Начните с нажатия кнопки «Выбрать платформу» . Затем нажмите кнопку « Включить службы для моего приложения Android» . Когда вы это сделаете, вам будет предложено указать имя и имя пакета Android для вашего приложения. Убедитесь, что указанное вами имя пакета Android совпадает с именем пакета, которое вы ввели при создании проекта Android Studio.
Затем нажмите кнопку « Выбрать и настроить службы» внизу. Теперь вы можете выбрать службы Google, которые хотите добавить в приложение.
На данный момент, нажмите кнопку Cloud Messaging , а затем нажмите Включить Google Cloud Messaging . Через несколько секунд вам будет представлен ваш ключ API сервера и идентификатор отправителя. Запишите ключ API сервера и нажмите Закрыть .
Плагину Google Services, который мы добавили ранее, для корректной работы необходим файл конфигурации. Создайте файл, нажав кнопку « Создать файлы конфигурации» .
После создания файла загрузите его и поместите в каталог приложения вашего проекта Android Studio.
3. Регистрация клиента
GCM идентифицирует устройства Android, используя регистрационные токены. Поэтому наше приложение должно иметь возможность регистрироваться с каждого устройства Android, на котором оно установлено.
Шаг 1: Создать регистрационную службу
Регистрация должна быть выполнена в фоновом потоке, потому что процесс может занять некоторое время в зависимости от сетевого подключения. Поскольку регистрация не требует ввода данных от пользователя, IntentService
идеально подходит для этой задачи.
Создайте новый класс Java с именем RegistrationService.java , сделайте его подклассом IntentService
и переопределите его метод onHandleIntent
.
« `открытый класс java RegistrationService extends IntentService {public RegistrationService () {super (« RegistrationService »); }
@Override protected void onHandleIntent (намерение намерения) { }} `` `
Внутри метода onHandleIntent
мы можем использовать API идентификатора экземпляра, чтобы сгенерировать или получить маркер регистрации. Сначала создайте InstanceID
класса InstanceID
, используя его метод getInstance
.
java InstanceID myID = InstanceID.getInstance(this);
Теперь мы можем использовать метод getToken
объекта InstanceID
чтобы получить маркер регистрации в виде String
. getToken
ожидает идентификатор отправителя в качестве одного из аргументов. Поскольку мы добавили файл google-services.json в наш проект, мы можем передать идентификатор отправителя методу, используя R.string.gcm_defaultSenderID
.
java String registrationToken = myID.getToken( getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null );
Если вы хотите просмотреть содержимое маркера регистрации в целях отладки, вы можете Log.d
его как отладочное сообщение, используя метод Log.d
java Log.d("Registration Token", registrationToken);
На этом этапе вы можете отправить регистрационный токен на ваш веб-сервер и сохранить его там в базе данных. Однако вам не нужно делать это, если вы не планируете обращаться к своим пользователям индивидуально. Если вы планируете отправлять одно и то же сообщение каждому пользователю, вам следует придерживаться подхода «публикация-подписка».
Теперь я покажу вам, как подписаться на topic
my_little_topic . Требуется всего две строки кода. Сначала создайте новый экземпляр класса GcmPubSub
используя его метод getInstance
. Затем вызовите его метод subscribe
и передайте ему маркер регистрации вместе с названием темы.
java GcmPubSub subscription = GcmPubSub.getInstance(this); subscription.subscribe(registrationToken, "/topics/my_little_topic", null);
Наше приложение теперь может получать каждое push-уведомление, опубликованное на my_little_topic .
Наконец, определите службу в AndroidManifest.xml .
« `XML
« `
Служба регистрации завершена.
Шаг 2. Создайте InstanceIDListenerService
Регистрационные токены периодически обновляются. Следовательно, каждое Android-приложение, которое использует GCM, должно иметь InstanceIDListenerService
который может обрабатывать эти обновления. Поэтому создайте новый файл Java с именем TokenRefreshListenerService.java и сделайте его подклассом InstanceIDListenerService
. Внутри метода класса onTokenRefresh
все, что нам нужно сделать, — это просто снова запустить процесс регистрации, запустив службу регистрации с помощью Intent
и метода startService
.
Добавьте следующий код в TokenRefreshListenerService.java :
java public class TokenRefreshListenerService extends InstanceIDListenerService { @Override public void onTokenRefresh() { Intent i = new Intent(this, RegistrationService.class); startService(i); } }
Этот сервис должен иметь возможность реагировать на действие com.google.android.gms.iid.InstanceID
. Поэтому при определении службы в AndroidManifest.xml добавьте соответствующий intent-filter
.
« `XML
« `
Шаг 3: Запуск службы регистрации
Чтобы убедиться, что процесс регистрации начинается сразу после запуска приложения, мы должны запустить класс RegistrationService
внутри метода MainActivity
. Для этого создайте для него Intent
и используйте метод startService
.
java Intent i = new Intent(this, RegistrationService.class); startService(i);
4. Отображение push-уведомлений
GCM автоматически отображает push-уведомления в панели уведомлений сразу после их получения. Однако это происходит только в том случае, если связанное приложение содержит GCMListenerService
.
Создайте новый класс Java с именем NotificationsListenerService и сделайте его подклассом GCMListenerService
. Если вы не хотите обрабатывать помещенные данные самостоятельно, вам не нужно писать код внутри этого класса. Мы можем пока оставить этот класс пустым.
« `открытый класс Java NotificationsListenerService extends GcmListenerService {
} « `
При определении сервиса в AndroidManifest.xml убедитесь, что вы добавили intent-filter
который позволяет ему реагировать на действие com.google.android.c2dm.intent.RECEIVE
.
« `XML
« `
5. Добавление значков push-уведомлений
С каждым push-уведомлением должен быть связан значок. Если у вас его нет, вы можете получить его из библиотеки значков дизайна материалов Google.
Как только вы загрузите значок, поместите его в папку 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. Импортируйте также модуль json
поскольку отправляемые нами данные должны быть действительными в формате JSON. Наконец, чтобы получить доступ к аргументам командной строки, импортируйте модуль sys
.
python from urllib2 import * import urllib import json import sys
Затем создайте переменную, в которой хранится ключ API сервера, который вы заметили ранее. Ключ должен быть частью каждого HTTP-запроса, который мы делаем к CCS.
python MY_API_KEY="ABCDEF123456789ABCDE--12A"
Каждое уведомление должно иметь заголовок и текст. Вместо того, чтобы жестко кодировать их в нашем скрипте, давайте примем заголовок и тело в качестве аргументов командной строки, используя массив argv
.
python messageTitle = sys.argv[1] messageBody = sys.argv[2]
Создайте новый объект словаря Python для представления данных, которые должны быть отправлены в CCS. Чтобы наше приложение для Android могло получать уведомление, оно должно быть опубликовано в теме my_little_topic . Поэтому добавьте ключ, вызываемый в словарь, и установите его значение в / themes / my_little_topic .
Чтобы отобразить содержимое уведомления, добавьте ключ под названием уведомление в словарь и установите его значение для другого объекта словаря, содержащего три ключа:
- тело
- заглавие
- икона
Убедитесь, что значение icon
соответствует имени значка, который можно нарисовать в вашем проекте Android.
python data={ "to" : "/topics/my_little_topic", "notification" : { "body" : messageBody, "title" : messageTitle, "icon" : "ic_cloud_white_48dp" } }
Преобразуйте словарь в строку JSON, используя функцию json
модуля json
:
python dataAsJSON = json.dumps(data)
Все, что нам нужно сделать сейчас, это отправить строку JSON на https://gcm-http.googleapis.com/gcm/send . Для этого создайте новый объект Request
и установите dataAsJSON
качестве его данных. Затем установите для заголовка Authorization
значение MY_API_KEY
а для MY_API_KEY
Content-type
— application / json .
python request = Request( "https://gcm-http.googleapis.com/gcm/send", dataAsJSON, { "Authorization" : "key="+MY_API_KEY, "Content-type" : "application/json" } )
Наконец, чтобы выполнить запрос и получить ответ, передайте объект запроса в функцию urlopen
и вызовите его метод read
.
python print urlopen(request).read()
Скрипт Python завершен и готов к использованию.
Шаг 2: Запуск скрипта
На данный момент мы готовы отправлять push-уведомления на все устройства, на которых установлено наше приложение. Откройте терминал и введите каталог, в котором вы создали send.py.
Передайте имя скрипта исполняемому файлу python
вместе со строкой для заголовка уведомления и строкой для тела уведомления. Вот пример, который вы можете использовать:
bash python send.py "My first push notification" "GCM API is wonderful!"
Если ошибок нет, вы должны получить ответ, который выглядит следующим образом:
javascript {"message_id":12345676892321}
Если вы проверите свое устройство Android, вы должны увидеть новое уведомление в трее уведомлений.
Вывод
Теперь вы знаете, как отправлять push-уведомления своим пользователям. На этом уроке вы узнали, как создать приложение для Android, способное регистрироваться и получать уведомления, опубликованные по определенной теме. Вы также узнали, как создать скрипт Python, который может публиковать уведомления.
Несмотря на то, что push-уведомления могут показаться отличным способом общения с вашими пользователями, я предлагаю вам использовать их экономно и только в том случае, если у вас есть что-то полезное, чтобы сказать, потому что отправка слишком многих из них слишком часто, возможно, самый быстрый способ получить ваше приложение удален.
Чтобы узнать больше о Google Cloud Messaging, обратитесь к Руководству по облачным сообщениям .