В помощь мобильному разработчику
Firebase лого

Firebase Cloud Messaging в Xamarin.Android

Александр Алексеев

В последние время эту тему часто поднимали в XamarinChat Slack. Ведь если присмотреться, сейчас доступно не так уж много информации о том, как подключить Firebase Cloud Messaging (FCM) для работы в проекте Xamarin.Android. Примерно месяц тому назад я реализовал в одном из моих приложений переключатель с Google Cloud Messaging на FCM и также столкнулся с проблемой нехватки информации о том, как добиться того, чтобы это всё работало. Я сумел заставить их работать совместно только за счет того, что не поленился объединить в одно целое знания из мира Java, которые я собирал по кусочкам. И самое интересное, что здесь практически нет отличий в том, как это делается с Xamarin.Android.

 

1. Создание Firebase Project

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

  1. Перейдите в Firebase Console

1

  1. Создайте новый проект или импортируйте Google Project

2

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

 

2. Регистрация приложений

После того как был создан новый проект или импортирован существующий, можно добавить свое приложение. Это можно сделать в нескольких местах на консоли. Я просто перехожу к уведомлениям (Notifications), и они подсказывают мне добавить приложение.

3

При нажатии на значок Android показывается следующие диалоговое окно:

4

Здесь нужно ввести данные приложения. Имя пакета будет аналогично тому, которое установлено в файле AndroidManifest.xml. Возможно, нужно будет изменить его на что-то, напоминающее пространство имен в приложении. Убедитесь также в том, что все это набрано в нижнем регистре. Псевдоним пользователя не является обязательным, и это просто удобный способ определения Вашего приложение в консоли. Кликните Add App или опционально выполните шаг 2.1, добавив сначала SHA-1, а уже затем нажав Add App. Теперь браузер загрузит файл google-services.json, который понадобится позже в шаге 4.

 

2.1 Создание хранилища ключей (опционально)

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

В любом случае это потребуется для развертывания приложения в Google Play Store. Это будет нужно для таких сервисов Google Play, как Google Maps. Проще всего это сделать в Archive tool в Visual Studio или Xamrin Studio, который вызывается посредством щелчка правой кнопкой мыши на проект Android-приложения. Убедитесь в том, что выбранная конфигурация запуска (Release Configuration) и Ваше приложение могут осуществить сборку.

5

В нижней части экрана Archive, когда Archive будет готов, кликните на Distribute… > Ad Hoc > +

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

Примечание: хранилище ключей используется для подписания приложения с целью развертывания его в Google Play Store. Многие сервисы Google Play требуют того, чтобы SHA-1 входил в консоль Google с Вашим пакетом приложения.

На Windows, Xamarin Archives помещает хранилище ключей по пути: C:\Users\<username>\AppData\Local\Xamarin\Mono for Android\Keystore Вы можете найти его в специальных подпапках с названием, соответствующим имени только что созданного Вами хранилища ключей. Для того чтобы извлечь SHA-1 из хранилища ключей нужно запустить инструмент командной строки Keytool. Если его нет в пути доступа (PATH) Вашей среды, тогда он находится в папке Java SDK. В моем случае он расположен по адресу C:\Program Files\Java\jdk1.8.0_102\bin — просто предположим, что его нет по определённому пути в Вашей среде, тогда команда для его получения будет выглядеть примерно так:

yourkeystorealias будет именем Вашего хранилища ключей в этом примере. Однако, хранилище ключей может содержать несколько дополнительных имён, которые, по всей видимости, не имеют особого значения для инструмента Xamarin Archive. Выводимые данные будет выглядеть следующим образом:

SHA Console

Нам требуется SHA-1, можно ввести это в сертификат SHA-1 в случае с проектом Firebase.

Вы также можете извлечь его из debug.keystore в C:\Users\<username>\AppData\Local\Xamarin\Mono для папки Android и позже ввести его в качестве дополнительного отпечатка в консоли Firebase.

 

3. Добавление к проекту FCM NuGet 

Прежде чем мы продолжим и перейдем к пункту 4, где мы добавляем к проекту google-services.json. Нам нужно добавить некоторые NuGet для FCM и Build Action, которые нужны в пункте 4, что идут с Google Play Services Nuget.

Добавьте Xamarin.Firebase.Messaging NuGet к проекту. В настоящее время они доступны только в предварительной версии. Следовательно, Вам нужно поставить галочку «Include Prerelease» в менеджере пакетов NuGet.

9

 

4. Добавление google-services.json к приложению

Теперь мы добавим файл google-services.json из пункта 2 в Android-проект.

Щелкните правой кнопкой мыши на проект, выберите Add > Exisiting Item и найдите файл google-services.json в папке, в которую он был загружен браузером, а затем нажмите Add.

Теперь нам нужно установить действие сборки этого файла в GoogleServicesJson.

Примечание: если действие сборки (Build Action) GoogleServicesJson не присутствует, тогда следуйте инструкциям по поводу данной ошибки на GitHub, в которых Вам будет предложено: 1. очистить/рекомпилировать проект. 2. перезапустить Visual Studio/Xamarin Studio. 3. убедиться в том, что файл csproj включает в себя Xamarin.GooglePlayServices.Basement.targets

Включите Build Action, щелкнув правой кнопкой мыши на файл google-servies.json, который Вы добавили к проекту. Нажмите кнопку «Свойства» (Properties). И установите здесь Build Action.

 

5. Добавление FCM-ресиверов в файл AndroidManifest

В файл AndroidManifest.xml нам нужно внести несколько записей для FCM BroadcastReceivers, которые не были добавлены вместе с пакетом NuGet.

Найдите в манифесте тег <application>. И внести в этот пункт следующий код:

Будете внимательны, и введите именно Ваше собственное имя пакета в этой части кода.

 

Реализация FirebaseInstanceIdService и FirebaseMessagingService

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

И FirebaseMessagingService — службу, которая будет вызываться, когда мы получим уведомление в приложении. Здесь вы готовите уведомления, которые будут отображаться с данными, полученными от FCM.

6.1 FirebaseInstanceIdService

Для того чтобы получить токен от регистрации приложения с FCM, нам необходимо реализовать FirebaseInstanceIdService. Здесь можно сохранить токен и передать его серверному модулю, который отправляет уведомления в приложение.

 

В TODO-комментарие то, что я совершаю в шагах 1 и 2, изложено, как проверка посредством сохраненного токена в SharedPreferences того, изменилось оно или перехватывает управление, если он есть. После этого я отправляю запрос на мой серверный модуль с новым токеном.

 

6.2 FirebaseMessagingService

The FirebaseMessagingService — это то место, где мы получаем наши уведомления. Здесь вы получите данные из уведомления, направленного к вам. Если Вы послали дополнительные вещи с уведомлением, обратите внимание на свойство Data в аргументе RemoteMessage, который мы получаем в OnMessageReceived. Это, вероятно, также применимо к raw-уведомлениям, которые не вызывают какой-либо визуальной обратной связи.

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

 

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

device-2016-11-11-210429

GooglePlayServicesComponents — это хранилище, которое находится в ведении Xamarin на GitHub, и оно содержит образец приложения, с которым Вы можете познакомиться поближе, если Вам нужна отправная точка. Вы также можете взглянуть на документацию по Firebase Component, которого ещё нет в Xamarin Component store

Автор: Tomasz Cielecki (Cheesebaron)
ИсточникОфициальный блог автора
Twitter@Cheesebaron
GitHubCheesebaron

Немного об авторе:
Имеет статус  Xamarin MVP и является членом сообщества Xamarin.

Советую посмотреть его GitHub проекты среди них есть реально полезные компоненты и примеры.

Александр Алексеев
Александр Алексеев

Xamarin - разработчик. Работаю с .NET платформой с 2012 года, программирую в основном с использованием C#. За это время успел поработать с ASP.NET, Entity Framework, MSSQL, Git

Написать ответ