Статьи

Как начать работу с Push-уведомлениями на Android

Заставить пользователей установить ваше приложение — это только полдела. Получение их, чтобы использовать это регулярно — другая половина. Вполне возможно, что ваши пользователи полностью забудут о вашем приложении после его использования только один или два раза. Что со всеми другими новыми приложениями, конкурирующими за их внимание.

Используя push-уведомления, вы можете время от времени напоминать пользователям о вашем приложении, увеличивая вероятность того, что ваше приложение останется установленным на их устройствах.

Google Cloud Messaging , сокращенно GCM, — это бесплатная услуга, которую вы можете использовать для отправки push-уведомлений своим пользователям. В этом руководстве вы узнаете, как использовать его для создания приложения Android, которое может получать push-уведомления, и простого сценария Python на стороне сервера, который может генерировать и отправлять их.

Для большинства соединений клиент-сервер клиент инициирует запросы на получение данных с сервера. Другими словами, клиент извлекает данные с сервера. Однако в случае push-уведомлений именно сервер инициирует передачу данных.

Обычно это достигается путем поддержания постоянного соединения TCP / IP — соединения, которое остается открытым в течение неопределенного времени — между сервером и клиентом. Это может звучать замечательно, но если у вас есть популярное приложение, поддержание тысяч постоянных соединений между вашим сервером и устройствами ваших пользователей может быть очень дорогим.

Google Cloud Messaging — это служба, которая решает эту проблему, выступая в качестве посредника между вашим сервером и устройством вашего пользователя. С GCM облачный сервер соединений Google, часто называемый CCS, управляет постоянными соединениями для вас. Это также гарантирует, что ваши push-уведомления доставляются безопасно и надежно.

Чтобы следовать за мной, вам нужно:

Запустите Android Studio и создайте новый проект с пустым Activity . Если вы использовали значения по умолчанию, проект должен включать класс Java в MainActivity.java .

В этом проекте мы будем использовать подключаемый модуль 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"

Если вы нажмете кнопку « Синхронизировать сейчас» , вы увидите следующую ошибку:

Установить репозиторий и синхронизировать проект

Нажмите на ссылку Установить репозиторий и синхронизируйте проект, чтобы исправить ошибку.

В файле AndroidManifest.xml проекта создайте и используйте настраиваемое разрешение C2D_MESSAGE на основе имени пакета вашего проекта. Убедитесь, что уровень protectionLevel для разрешения установлен на подпись .

« `XML

« `

Уведомления принимаются в виде трансляций. Для обработки этих трансляций нашему приложению необходим BroadcastReceiver . Однако нам не нужно создавать его вручную. Вместо этого мы можем использовать класс GcmReceiver в качестве BroadcastReceiver .

BroadcastReceiver должен иметь intent-filter который реагирует на действие com.google.android.c2dm.intent.RECEIVE а имя его category должно совпадать с именем пакета вашего проекта. Добавьте следующий код в манифест:

« `XML

« `

Во время связи с сервером облачных подключений нам необходимо идентифицировать себя, используя ключ API на стороне сервера и идентификатор отправителя на стороне клиента. Чтобы получить ключ API и идентификатор отправителя, создайте новый проект в консоли разработчика.

Экран приветствия

Начните с нажатия кнопки «Выбрать платформу» . Затем нажмите кнопку « Включить службы для моего приложения Android» . Когда вы это сделаете, вам будет предложено указать имя и имя пакета Android для вашего приложения. Убедитесь, что указанное вами имя пакета Android совпадает с именем пакета, которое вы ввели при создании проекта Android Studio.

Подробности проекта

Затем нажмите кнопку « Выбрать и настроить службы» внизу. Теперь вы можете выбрать службы Google, которые хотите добавить в приложение.

Доступные сервисы Google

На данный момент, нажмите кнопку Cloud Messaging , а затем нажмите Включить Google Cloud Messaging . Через несколько секунд вам будет представлен ваш ключ API сервера и идентификатор отправителя. Запишите ключ API сервера и нажмите Закрыть .

Ключ API сервера и идентификатор отправителя

Плагину Google Services, который мы добавили ранее, для корректной работы необходим файл конфигурации. Создайте файл, нажав кнопку « Создать файлы конфигурации» .

После создания файла загрузите его и поместите в каталог приложения вашего проекта Android Studio.

GCM идентифицирует устройства Android, используя регистрационные токены. Поэтому наше приложение должно иметь возможность регистрироваться с каждого устройства Android, на котором оно установлено.

Регистрация должна быть выполнена в фоновом потоке, потому что процесс может занять некоторое время в зависимости от сетевого подключения. Поскольку регистрация не требует ввода данных от пользователя, IntentService идеально подходит для этой задачи.

Создайте новый класс Java с именем RegistrationService.java , сделайте его подклассом IntentService и переопределите его метод onHandleIntent .

« `открытый класс java RegistrationService extends IntentService {public RegistrationService () {super (« RegistrationService »); }

Внутри метода 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

« `

Служба регистрации завершена.

Регистрационные токены периодически обновляются. Следовательно, каждое 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

« `

Чтобы убедиться, что процесс регистрации начинается сразу после запуска приложения, мы должны запустить класс RegistrationService внутри метода MainActivity . Для этого создайте для него Intent и используйте метод startService .

java Intent i = new Intent(this, RegistrationService.class); startService(i);

GCM автоматически отображает push-уведомления в панели уведомлений сразу после их получения. Однако это происходит только в том случае, если связанное приложение содержит GCMListenerService .

Создайте новый класс Java с именем NotificationsListenerService и сделайте его подклассом GCMListenerService . Если вы не хотите обрабатывать помещенные данные самостоятельно, вам не нужно писать код внутри этого класса. Мы можем пока оставить этот класс пустым.

« `открытый класс Java NotificationsListenerService extends GcmListenerService {

} « `

При определении сервиса в AndroidManifest.xml убедитесь, что вы добавили intent-filter который позволяет ему реагировать на действие com.google.android.c2dm.intent.RECEIVE .

« `XML

« `

С каждым push-уведомлением должен быть связан значок. Если у вас его нет, вы можете получить его из библиотеки значков дизайна материалов Google.

Библиотека иконок дизайна материалов

Как только вы загрузите значок, поместите его в папку res вашего проекта. Я буду использовать ic_cloud_white_48dp в качестве значка.

Наше приложение для Android завершено. Как только вы скомпилируете его и запустите на устройстве Android, вы сможете увидеть регистрационный токен в журналах logcat .

Регистрационный токен в logcat

Нажмите кнопку «Назад» на вашем устройстве, чтобы выйти из приложения. Это необходимо, потому что GCM будет отображать push-уведомления автоматически, только если пользователь не использует приложение. Если вы хотите, чтобы уведомления отображались даже во время работы приложения, вам придется самостоятельно создавать уведомления внутри NotificationsListenerService с помощью класса Notification.Builder .

В заключительной части этого руководства мы создадим простой скрипт Python, который может генерировать и отправлять push-уведомления всем устройствам Android, на которых установлено наше приложение.

Вы можете запустить этот скрипт с локального компьютера или с удаленного веб-сервера, к которому у вас есть доступ по SSH.

Создайте новый файл с именем 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-typeapplication / 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 завершен и готов к использованию.

На данный момент мы готовы отправлять push-уведомления на все устройства, на которых установлено наше приложение. Откройте терминал и введите каталог, в котором вы создали send.py.

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

bash python send.py "My first push notification" "GCM API is wonderful!"

Если ошибок нет, вы должны получить ответ, который выглядит следующим образом:

javascript {"message_id":12345676892321}

Если вы проверите свое устройство Android, вы должны увидеть новое уведомление в трее уведомлений.

Push-уведомление в трее уведомлений

Теперь вы знаете, как отправлять push-уведомления своим пользователям. На этом уроке вы узнали, как создать приложение для Android, способное регистрироваться и получать уведомления, опубликованные по определенной теме. Вы также узнали, как создать скрипт Python, который может публиковать уведомления.

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

Чтобы узнать больше о Google Cloud Messaging, обратитесь к Руководству по облачным сообщениям .