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

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

В этом туториале я рассмотрю пошагово, как отправлять со своего сервера уведомления на свой (или не свой) смартфон, какие средства для этого понадобятся. Эти способы универсальны и подойдут для любого языка программирования, т.к. напрямую используют 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 (тем, который персональный для приложения). Жмём «Продолжить».

Шаг 3 — Добавляем в проект зависимости. в файл /build.gradle строчку classpath 'com.google.gms:google-services:3.1.0' в файл /<app-module>/build.gradle строчку apply plugin: 'com.google.gms.google-services' Тут всё, жмём «Готово».

После настройки приложения, можно сразу протестировать работает ли связь отправив тестовое сообщение (нет нельзя, у нас ещё нет 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, видимо первая считалась бетой и носила нулевой номер. Я не углублялся в подробности, но так понимаю этот протокол более универсальный и имеет более широкие возможности, чем просто отправка уведомлений.

по адресу 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 и т.п., но тема статьи — домашние сервера, и прочие умные дома. Считаю системы корпоративного класса перебором в любительских поделках.

📎📎📎📎📎📎📎📎📎📎