Перехват push уведомлений android

Содержание
  1. Пара способов отправить уведомления на смартфон со своего сервера
  2. 1. Регистрируемся в Firebase
  3. 2. Настраиваем Firebase
  4. 3. Настройка приложения Android на приём уведомлений.
  5. 4. Отправляем уведомление со своего сервера
  6. Протокол первого поколения — Legacy HTTP
  7. Протокол второго поколения — (Modern) HTTP v1.
  8. Бонус, дополнительные параметры для уведомлений:
  9. Заключение
  10. Как начать работу с Push-уведомлениями на Android
  11. Введение
  12. Зачем использовать Google Cloud Messaging?
  13. Предпосылки
  14. 1. Настройка проекта Android Studio
  15. Шаг 1: добавьте зависимости
  16. Шаг 2: обновите манифест
  17. 2. Получите ключ API сервера и идентификатор отправителя
  18. 3. Регистрация клиента
  19. Шаг 1. Создание службы регистрации
  20. Шаг 2. Создание службы InstanceIDListenerService
  21. Шаг 3: Запуск службы регистрации
  22. 4. Отображение Push-уведомлений
  23. 5. Добавление значков Push Notification
  24. 6. Запуск приложения для Android
  25. 7. Отправка Push-уведомлений
  26. Шаг 1. Создание сценария
  27. Шаг 2. Запуск сценария
  28. Заключение

Пара способов отправить уведомления на смартфон со своего сервера

В этом туториале я рассмотрю пошагово, как отправлять со своего сервера уведомления на свой (или не свой) смартфон, какие средства для этого понадобятся. Эти способы универсальны и подойдут для любого языка программирования, т.к. напрямую используют API гугла, без использования библиотек. Отправить можно на смартфоны с Android, iOS и в браузеры с поддержкой Push API (на сегодня это Chrome, Firefox и их производные).

В общем всем тем, кто давно хотел отправлять уведомления со своего домашнего сервера на свой смартфон, но не знал с чего начать, посвящается.

Немного истории. В начале (с версии андроида 2.2) у гугла для доставки использовалась система C2DM (Android Cloud to Device Messaging), начиная с июня 2012 для этого стали предлагать использовать GCM (Google cloud messaging).

В настоящее время используется универсальная платформа Firebase, которая помимо доставки уведомлений имеет ещё много всяких других возможностей. Firebase тоже успела эволюционировать и протокол первого поколения уже считается устаревшим и для доставки сообщений рекомендуется использовать протокол второго поколения.

Технически, уведомления отправляются с сервера не напрямую в смартфон, а на некий промежуточный сервер, на котором при необходимости хранятся до 4-х недель (настраиваемо), и по возможности отправляются получателю. Т.е. если смартфон находится оффлайн, сервер ждёт. Как только появляется возможность — отправляет.

1. Регистрируемся в Firebase

Для регистрации в Firebase понадобится учётка гугла.

Жмём «Перейти к консоли».

Затем «Добавить проект».

Вводим название проекта. Рекомендую в диапазоне 8-16 символов.
Выбираем страну. Жмём «Создать проект».

2. Настраиваем Firebase

Прокручиваем до блока «Notifications», жмём «Начать».

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

Шаги для Andriod-приложения:

Шаг 1 — Вводим название проекта на Andriod.
Жмём «Зарегистрировать приложение».

Шаг 2 — Жмём «Скачать google-services.com».
Добавляем скачанный файл конфигурации в проект, рядом с файлом build.gradle (тем, который персональный для приложения).
Жмём «Продолжить».

После настройки приложения, можно сразу протестировать работает ли связь отправив тестовое сообщение (нет нельзя, у нас ещё нет ID клиента, куда слать).

3. Настройка приложения Android на приём уведомлений.

Важное примечание: некоторые оболочки, например MIUI, могут блокировать уведомления, если приложение не запущено или не висит в фоне. Делается это якобы для экономии заряда батареи.

Грубо говоря, отправлять можно два вида уведомлений:
— уведомление по запросу,
— уведомление с полезной нагрузкой.
У них разные способы взаимодействия с приложением.

Уведомление по запросу выведет уведомление в области уведомлений, но только в случае если приложение свёрнуто. При тапе пользователя оно откроет заранее выбранную (при отправке) активити приложения, и передаст бандлом экстра-параметры.

Уведомление с полезной нагрузкой требует наличия в приложении пары служб, в которые и передаётся управление, но на длительность не дольше 10 секунд.

Ниже приведён пример службы, которая отвечает за генерацию ID клиента.

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

не забудьте прописать службы в манифесте.

ID клиента генерируется на устройстве, но вы сами выбираете способ доставки этого ID к себе на сервер.

Вот теперь можно протестировать, отправив тестовое сообщение из консоли.

4. Отправляем уведомление со своего сервера

Существует несколько способов обмена данными с сервером Firebase. Мы рассмотрим два способа обмена по протоколу HTTP.

Протокол первого поколения — Legacy HTTP

Понадобится ключ. Жмём на гайку, выбираем «Настройки проекта».

Вкладка «Cloud Messaging».
Копируем «Устаревший ключ сервера».

Здесь в поле «to» надо подставить ID клиента. В http заголовок «Authorization: key=» подставить «Устаревший ключ сервера».

Протокол второго поколения — (Modern) HTTP v1.

(источник: developers.google.com/identity/protocols/OAuth2ServiceAccount)
Не спрашивайте, почему вторая версия протокола называется V1, видимо первая считалась бетой и носила нулевой номер.
Я не углублялся в подробности, но так понимаю этот протокол более универсальный и имеет более широкие возможности, чем просто отправка уведомлений.

Читайте также:  From windows mobile to android

‘; // — parse answer JSON (lame) — // $line = explode(«\r\n», $receive); if ($line[0] != ‘HTTP/1.1 200 OK’) die($line[0]); $pos = FALSE; if (($pos = strpos($receive, «\r\n\r\n», 0)) !== FALSE ) < if (($pos = strpos($receive, "<", $pos+4)) !== FALSE ) < if (($pose = strpos($receive, ">«, $pos+1)) !== FALSE ) < $post = substr($receive, $pos, ($pose - $pos+1) ); $aw = json_decode($post, TRUE); $access_token = $aw['access_token']; >else die(‘> not found.’); > else die(‘ < not found.'); >else die(‘\r\n\r\n not found.’); // — шаг 3. отправляем запрос на Firebase сервер — // $socket = @fsockopen(‘ssl://fcm.googleapis.com’, 443, $errno, $errstr, 10); if (!$socket) die(‘error: remote host is unreachable.’); $payload = ‘ < "message":< "token" : "cGAFgPJGf-s:APA91bF**. **aEVM17c9peqZ", "notification" : < "title" : "Заголовок сообщения", "body" : "(Modern API) Моё первое сообщение через Firebase!" >> >’; // или $payload = ‘ < "message": < "token" : "cGAFgPJGf-s:APA91bF**. **aEVM17c9peqZ", "data":< "val1" : "Заголовок сообщения", "val2" : "(Modern API) Моё первое сообщение через Firebase!", "val3" : "дополнительные данные" >> >’; $send = »; $send .= ‘POST /v1/projects/pyur-test-id/messages:send HTTP/1.1’.»\r\n»; $send .= ‘Host: fcm.googleapis.com’.»\r\n»; $send .= ‘Connection: close’.»\r\n»; $send .= ‘Content-Type: application/json’.»\r\n»; $send .= ‘Authorization: Bearer ‘.$access_token.»\r\n»; $send .= ‘Content-Length: ‘.strlen($payload).»\r\n»; $send .= «\r\n»; $send .=$payload; $result = fwrite($socket, $send); $receive = »; while (!feof($socket)) $receive .= fread($socket, 8192); fclose($socket); echo »; ?>

по адресу console.firebase.google.com/project/poject-id/settings/serviceaccounts/adminsdk надо скопировать «Сервисный аккаунт Firebase» и подставить в переменную «$JWT_claim_set», в поле «iss».

Жмём «Создание закрытого ключа»

Создаём ключ, сохраняем, никому не показываем. В скачанном файле будет содержаться «Закрытый ключ», его подставляем в переменную «$private_key».

Хинт: токен, полученный в шагах 1 и 2 можно и нужно кешировать в локальном временном хранилище, например файле, или базе данных. И только по истечении времени (по умолчанию один час), запрашивать у сервера авторизации следующий токен.

Важно! Перед использованием Modern Http API необходимо явно разрешить его использование здесь: console.developers.google.com/apis/library/fcm.googleapis.com/?project=your-project

Бонус, дополнительные параметры для уведомлений:

sound — либо «default», либо имя ресурса в приложении. Должен располагаться в «/res/raw/». Формат MP3, AAC или ещё чего подходящее.
icon — меняет иконку уведомления. Должна храниться в «drawable» приложения. Если отсутствует, FCM будет использовать иконку приложения (указанную как «launcher icon» в манифесте приложения).
tag — Следует использовать для группировки однотипных уведомлений. Новые уведомления будут выводиться поверх уже имеющихся с таким же тегом.
color — цвет иконки, задаётся как «#rrggbb» (у меня в MIUI не заработало)
click_action — запускаемое активити, при нажатии пользователем на уведомлении.

Заключение

В будущем API вероятно будет изменяться, объявляться depricated и т.п. Поэтому сегодня думаю стоит делать сразу на протоколе HTTP v1.

Мне будет интересно почитать в комментариях оригинальные способы применения уведомлений, помимо новых сообщений из вконтактика. К примеру у меня настроен мониторинг вентиляторов ардуиной, и если они остановятся, отправляется уведомление.

Да, я в курсе, что существует Zabbix и т.п., но тема статьи — домашние сервера, и прочие умные дома. Считаю системы корпоративного класса перебором в любительских поделках.

Источник

Как начать работу с 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
Читайте также:  Location android phone app

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 .

Читайте также:  Whatsapp для андроид разговор

Шаг 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, см. Руководство по облачным сообщениям.

Источник

Оцените статью