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

Обзор:

Firebase Cloud Messaging (FCM) - это кроссплатформенный сервис, который обрабатывает отправку, маршрутизацию и постановку в очередь сообщений между серверными приложениями и мобильными приложениями.

FCM является заменой Google Cloud Messaging (GCM) и основан на сервисах Google Play.

Вы можете узнать, как настроить Android-приложение на консоли Firebase, в этом подробном посте от Microsoft:



Для начала зайдите в Консоль Firebase, войдите в систему и создайте новый проект Android. Вам будет предложено ввести название вашего пакета, которое вы можете найти в вашем AndroidManifest.xml файле.

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

Настройка Firebase Cloud Messaging (консоль)

Прежде чем вы сможете использовать сервисы FCM в своем приложении, вы должны создать новый проект (или импортировать существующий) через Firebase Console. Выполните следующие действия, чтобы создать проект Firebase Cloud Messaging для вашего приложения:

1. Войдите в Firebase Console со своей учетной записью Google (Gmail) и нажмите Добавить проект:

Если у вас есть существующий проект, добавьте туда новый проект Android.

2. В диалоговом окне Add a project введите имя своего проекта, примите все положения и условия и щелкните CREATE PROJECT. В следующем примере создается новый проект с именем XamarinFCM :

3. В обзоре консоли Firebase щелкните значок Android, чтобы добавить Firebase в свое приложение Android:

4. На следующем экране введите имя пакета вашего приложения. В этом примере имя пакета com.xamarin.fcmexample. Это значение должно совпадать с названием пакета вашего Android-приложения. Псевдоним приложения также можно ввести в поле App nickname:

Если ваше приложение использует динамические ссылки, приглашения или Google Auth, вы также должны ввести свой сертификат подписи отладки. Для получения дополнительной информации о том, как найти сертификат подписи, ознакомьтесь с документацией по поиску подписи MD5 или SHA1 вашего хранилища ключей. В этом примере сертификат подписи оставлен пустым, поскольку он не является обязательным.

5. Загрузите файл google-services.json, так как он понадобится вам при настройке Firebase в мобильном приложении. Нажмите Далее.

6. Интеграция Firebase SDK через gradle - это встроенная функция Android Studio, поэтому мы можем пропустить синхронизацию и перейти к следующему шагу.

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

8. Теперь у вас все готово, чтобы начать работу над мобильным приложением. Также обратите внимание, что вы всегда можете щелкнуть имя проекта, чтобы изменить настройки (для настроек, которые позволяют изменять их, например, для добавления ключа SHA1).

Что следует помнить

  • Для приложения автоматически генерируются ключ API сервера и идентификатор клиента. Эта информация упакована в google-services.json файл, который автоматически загружается, когда вы нажимаете кнопку загрузки на ШАГЕ 5 (Настройка). Обязательно сохраните этот файл в надежном месте.
  • Ваше имя пакета и ваш google-services.json файл связаны друг с другом - имя пакета является неотъемлемой частью файла JSON, и именно оно связывает ваше мобильное приложение с Firebase Cloud, поэтому каждое имя пакета создает отдельный файл JSON. Поэтому убедитесь, что вы не используете несоответствие, так как это приведет к сбою ваших push-уведомлений и невозможности их передачи на устройства.
  • Если вам нужно изменить имя пакета мобильного приложения после его добавления и настройки в Firebase, вам нужно будет создать новый проект на основе этого имени пакета и выполнить новую настройку, как показано выше.

Настройка обмена сообщениями Firebase Cloud (клиент / мобильный)

1. Установка имени пакета

В настройке консоли вы указали имя пакета для приложения с поддержкой FCM. Это имя пакета также служит идентификатором приложения, связанным с ключом API.

Настройте приложение для использования этого имени пакета в файле AndroidManifest.xml. При обновлении манифеста Android убедитесь, что разрешено Internet permission.

Примечание. Клиентское приложение не сможет получить токен регистрации от FCM, если это имя пакета не в точности соответствует имени пакета, которое было введено в Firebase Console.

2. Добавьте службы Xamarin Google Play.

Поскольку обмен сообщениями Firebase Cloud зависит от сервисов Google Play, пакет NuGet Xamarin Google Play Services - Base необходимо добавить в проект Xamarin.Android. Вам понадобится версия 29.0.0.2 или новее.

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

3. Добавьте Xamarin Firebase Messaging.

Для получения сообщений от FCM в проект приложения необходимо добавить пакет NuGet Xamarin Firebase - Messaging. Без этого пакета приложение Android не может получать сообщения от серверов FCM. При установке Xamarin.Firebase.Messaging также устанавливаются все необходимые зависимости.

Затем отредактируйте MainActivity.cs и добавьте следующие using операторы:

Firebase Messaging и Iid, поставляемые сXamarin.Firebase.Messaging пакетом NuGet, делают функции firebase доступными для вашего проекта.

Android.Util добавляет функцию ведения журнала, которая будет использоваться для наблюдения за транзакциями с помощью службы обмена сообщениями Firebase (FMS).

4. Добавьте JSON сервисов Google.

Следующим шагом будет добавление файла google-services.json в корневой каталог вашего проекта:

Visual Studio:

  1. Скопируйте google-services.json в папку проекта.
  2. Добавьте google-services.json в проект приложения (щелкните Показать все файлы в обозревателе решений, щелкните правой кнопкой мыши google-services.json, затем выберите Включить в проект).
  3. Выберите google-services.json в окне обозревателя решений.
  4. На панели «Свойства» установите для параметра «Действие сборки» значение GoogleServicesJson:

Примечание:

Если GoogleServicesJson действие сборки не отображается, сохраните и закройте решение, а затем снова откройте его.

Visual Studio для MAC

  1. Скопируйте google-services.json в папку проекта.
  2. Добавьте google-services.json в проект приложения.
  3. Щелкните правой кнопкой мыши google-services.json.
  4. Установите действие сборки на GoogleServicesJson:

5. Проверьте сервисы Google Play и создайте канал уведомлений.

Google рекомендует, чтобы приложения Android проверяли наличие APK сервисов Google Play перед доступом к функциям сервисов Google Play (для получения дополнительной информации см. Проверка сервисов Google Play).

Отредактируйте MainActivity.cs и добавьте следующие переменные экземпляра в класс MainActivity:

Переменные CHANNEL_ID и NOTIFICATION_ID будут использоваться в методе CreateNotificationChannel, который будет добавлен к MainActivity позже в этом пошаговом руководстве.

В следующем примере метод OnCreate проверяет доступность служб Google Play до того, как приложение попытается использовать службы FCM. Добавьте в класс MainActivity следующий метод:

Этот код проверяет устройство, чтобы узнать, установлен ли APK сервисов Google Play. Если он не установлен, он возвращает false, а если он установлен, возвращает true, поэтому вы можете попросить пользователя загрузить GooglePlayServices APK из магазина Google Play ( или включить его в системных настройках устройства).

Приложения, работающие на Android 8.0 (уровень API 26) или выше, должны создавать канал уведомлений для публикации своих уведомлений. Добавьте в класс MainActivity следующий метод, который будет создавать канал уведомлений (при необходимости):

Добавьте следующий код в метод OnCreate:

IsPlayServicesAvailable вызывается в конце OnCreate, поэтому проверка служб Google Play запускается при каждом запуске приложения. Метод CreateNotificationChannel вызывается, чтобы убедиться, что канал уведомлений существует для устройств под управлением Android 8 или выше. Если в вашем приложении есть метод OnResume, оно также должно вызывать IsPlayServicesAvailable из OnResume. Полностью перестройте и запустите приложение.

6. Добавьте получатель идентификатора экземпляра.

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

7. Объявить получатель в Android Manifest

Отредактируйте AndroidManifest.xml и вставьте следующие <receiver> элементы в <application>секцию:

Этот XML-код выполняет следующие действия:

  • Объявляет FirebaseInstanceIdReceiver, реализацию, которая предоставляет уникальный идентификатор для каждого экземпляра приложения. Этот получатель также аутентифицирует и разрешает действия.
  • Объявляет внутреннюю FirebaseInstanceIdInternalReceiver, реализацию, используемую для безопасного запуска служб.
  • ID приложения хранится в google-services.json файле, который был добавлен в проект. Привязки Xamarin.Android Firebase заменят токен ${applicationId} идентификатором приложения; клиентскому приложению не требуется дополнительный код для предоставления идентификатора приложения.

FirebaseInstanceIdReceiver - это WakefulBroadcastReceiver, который принимает события FirebaseInstanceId и FirebaseMessaging и доставляет их классу, производному от FirebaseInstanceIdService.

8. Внедрите службу идентификатора экземпляра Firebase.

Работой по регистрации приложения в FCM занимается предоставляемая вами настраиваемая служба FirebaseInstanceIdService. FirebaseInstanceIdService выполняет следующие действия:

  1. Использует API идентификатора экземпляра для создания токенов безопасности, которые разрешают клиентскому приложению доступ к FCM и серверу приложений. Взамен приложение получает регистрационный токен от FCM.
  2. Перенаправляет регистрационный токен на сервер приложений, если он требуется серверу приложений.

Добавьте новый файл с именем MyFirebaseIIDService.cs и замените его код шаблона следующим:

Эта служба реализует метод theOnTokenRefresh, который вызывается при первоначальном создании или изменении регистрационного токена. Когда OnTokenRefresh запускается, он извлекает последний токен из свойства FirebaseInstanceId.Instance.Token (которое асинхронно обновляется FCM). В этом примере обновленный токен регистрируется, чтобы его можно было просмотреть в окне вывода:

OnTokenRefresh вызывается нечасто: он используется для обновления токена в следующих случаях:

  • Когда приложение установлено или удалено.
  • Когда пользователь удаляет данные приложения.
  • Когда приложение стирает идентификатор экземпляра.
  • Когда безопасность токена была скомпрометирована.

Согласно документации Google Instance ID, служба FCM Instance ID будет запрашивать у приложения периодическое обновление своего токена (обычно каждые 6 месяцев).

Типы уведомлений:

Ниже приведены различные типы доступных уведомлений.

  1. Фоновые уведомления
  2. Уведомления переднего плана
  3. Тематические сообщения

Фоновые уведомления:

Во-первых, вам нужно получить токен, сгенерированный Firebase в FirebaseInstanceIdService наследующем классе обслуживания. Получив токен, войдите в Firebase Console, выберите свой проект, нажмите Уведомления и нажмите ОТПРАВИТЬ ПЕРВОЕ СООБЩЕНИЕ:

На странице «Написать сообщение» введите текст сообщения и выберите Одно устройство. Скопируйте токен идентификатора экземпляра из окна вывода IDE и вставьте его в поле токена регистрации FCM:

На устройстве Android (или эмуляторе) запустите приложение в фоновом режиме, нажав кнопку «Обзор Android» и коснувшись главного экрана. Когда устройство будет готово, нажмите ОТПРАВИТЬ СООБЩЕНИЕ в консоли Firebase:

Когда откроется диалоговое окно с сообщением о проверке, нажмите ОТПРАВИТЬ. Значок уведомления должен появиться в области уведомлений устройства (или эмулятора):

Откройте значок уведомления, чтобы просмотреть сообщение. Уведомляющее сообщение должно быть именно тем, что было введено в текстовое поле сообщения в консоли Firebase:

В предыдущем примере значок уведомления установлен на значок приложения. Следующий XML-код настраивает пользовательский значок по умолчанию для уведомлений. Android отображает этот настраиваемый значок по умолчанию для всех уведомлений, для которых значок уведомления не установлен явно.

Чтобы добавить настраиваемый значок уведомления по умолчанию, добавьте свой значок в каталог Resources / drawable, отредактируйте AndroidManifest.xml и вставьте следующий элемент <meta-data> в <application>section:

В этом примере значок уведомления, расположенный по адресу Resources/drawable/ic_stat_ic_notification.png, будет использоваться в качестве настраиваемого значка уведомления по умолчанию. Если пользовательский значок по умолчанию не настроен в AndroidManifest.xml и в полезных данных уведомления не задан значок, Android использует значок приложения в качестве значка уведомления (как показано на снимке экрана значка уведомления выше).

Уведомления переднего плана:

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

Реализуйте FirebaseMessagingService

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

Примечание. У приложений есть только 10 секунд на обработку входящего сообщения Firebase Cloud. Любая работа, которая занимает больше времени, должна быть запланирована для фонового выполнения с использованием такой библиотеки, как Планировщик заданий Android или Диспетчер заданий Firebase.

Добавьте новый файл с именем MyFirebaseMessagingService.cs и замените его код шаблона следующим:

Метод SendNotification использует NotificationCompat.Builder для создания уведомления, а NotificationManagerCompat используется для запуска уведомления. Уведомление содержит PendingIntent, что позволит пользователю открыть приложение и просмотреть содержимое строки, переданной в messageBody. Дополнительную информацию о NotificationCompat.Builder можно найти в документации по локальным уведомлениям.

Обратите внимание на , что фильтр намерений MESSAGING_EVENT должен быть объявлен, чтобы новые сообщения FCM направлялись на MyFirebaseMessagingService:

[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]

Когда клиентское приложение получает сообщение от FCM, OnMessageReceived извлекает содержимое сообщения из переданного объекта RemoteMessage, вызывая свой GetNotification метод.

Примечание. Если вы установите точки останова в FirebaseMessagingService, ваш сеанс отладки может или не может достичь этих точек останова из-за того, как FCM доставляет сообщения.

Тематические сообщения:

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

Подпишитесь на тему

Вы можете использовать приведенный ниже код для регистрации в теме :

FirebaseMessaging.Instance.SubscribeToTopic(“news”);

Где «новости» - это строковое имя темы , Этот код находит кнопку «Подписаться на уведомление» в макете и назначает ее обработчик кликов коду, который вызывает FirebaseMessaging.Instance.SubscribeToTopic, передавая тему, на которую подписана подписка, новости. Когда пользователь нажимает кнопку «Подписаться», приложение подписывается на тему новости. В следующем разделе сообщение темы новости будет отправлено из графического интерфейса уведомлений консоли Firebase.

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

  1. В консоли Firebase нажмите НОВОЕ СООБЩЕНИЕ.
  2. На странице «Написать сообщение» введите текст сообщения и выберите «Тема».
  3. В раскрывающемся меню Тема выберите встроенную тему, новости:

4. На устройстве Android (или эмуляторе) запустите приложение в фоновом режиме, нажав кнопку «Обзор Android» и коснувшись главного экрана.

5. Когда устройство будет готово, нажмите ОТПРАВИТЬ СООБЩЕНИЕ в консоли Firebase. Проверьте окно вывода IDE, чтобы увидеть / themes / news в выводе журнала:

Когда это сообщение отображается в окне вывода, значок уведомления также должен отображаться в области уведомлений на устройстве Android. Откройте значок уведомления, чтобы просмотреть сообщение темы:

Если вы не получили сообщение, попробуйте удалить приложение на устройстве (или в эмуляторе) и повторите описанные выше действия.

Примечание: все изображения для различных типов обработки уведомлений я позаимствовал из Документов Microsoft.

Устранение неполадок

Ниже описаны проблемы и обходные пути, которые могут возникнуть при использовании Firebase Cloud Messaging с Xamarin.Android.

FirebaseApp не инициализирован

В некоторых случаях вы можете увидеть это сообщение об ошибке:

Java.Lang.IllegalStateException: Default FirebaseApp is not initialized in this process Make sure to call FirebaseApp.initializeApp(Context) first.

Это известная проблема, которую можно обойти, очистив решение и перестроив проект (Сборка ›Чистое решение, Сборка› Восстановить решение).

Пакет Firebase не установлен

В некоторых случаях вы можете увидеть это сообщение об ошибке, если у вас есть и Google Maps, и Firebase Cloud Messaging:

error: package com.google.firebase.messaging does not exist

Вы можете проверить этот вопрос на StackOverflow, который занимается и решает эту проблему.

Резюме:

В этом пошаговом руководстве подробно описаны шаги по реализации удаленных уведомлений Firebase Cloud Messaging в приложении Xamarin.Android. В нем описано, как установить необходимые пакеты, необходимые для связи FCM, и как настроить манифест Android для доступа к серверам FCM.

Он также предоставил пример кода, который иллюстрирует, как проверить наличие сервисов Google Play, как реализовать службу прослушивания идентификатора экземпляра, которая согласовывает с FCM токен регистрации, и объяснил, как этот код создает уведомления, пока приложение находится в фоновом режиме.

Примечание. Определенное содержание этого блога взято из Документов Microsoft.

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

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

Вы можете связаться со мной в LinkedIn или StackOverflow! Я всегда на связи! :П

Большое спасибо за то, что прочитали этот пост!

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

Являясь независимой редакцией, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по данным и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее создавать лучшие модели машинного обучения.