Rogapp
Как подключить Google Firebase к проекту MAUI
Рабочая реализация на готовом проекте
Уведомления в .NET MAUI с использованием Firebase
🎥 Видео на YouTube: ссылка
  1. Требования:
Общие:
  • Использовать .NET в проектах
Приложение, которое получает уведомления (в примере — App Business):
  • Установить NuGet-пакет Plugin.Firebase версии 2.0.10
  • Установить Plugin.Firebase.Crashlytics версии 2.0.2
  • Добавить ItemGroup с Xamarin.AndroidX.Preference версии 1.2.1.3 при таргете net8.0-android
Приложение, которое отправляет уведомления (в примере — App Clientes):
  • Установить NuGet-пакет FirebaseAdmin
Настройка App Business (принимающее уведомления)
1. Создайте MAUI-проект на .NET 8
  • Назовите приложение (например, AppBusiness).
2. Установите NuGet-пакеты:
  • Plugin.Firebase версии 2.0.10
  • Plugin.Firebase.Crashlytics версии 2.0.2
3. В файл проекта (*.csproj) добавьте:
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0-android'">
	<PackageReference Include="Xamarin.AndroidX.Preference">
		<Version>1.2.1.3</Version>
	</PackageReference>
</ItemGroup>
Перейдите на сайт https://firebase.google.com/?hl=es и выполните:
Нажмите "Перейти в консоль"
Создайте новый проект
Укажите имя проекта
Зарегистрируйте приложение:
  • Скопируйте значение <ApplicationId> из csproj и вставьте в Firebase
<ApplicationId></ApplicationId>
  • Укажите имя приложения
  • Нажмите "Далее" и скачайте google-services.json
В Visual Studio:
Перетащите google-services.json в корень проекта
В свойствах файла:
  • Измените Действие при компиляции на GoogleServiceJson
В папке Platforms/Android/Resources/values:
Добавьте XML-файл, назовите его strings.xml
Вставьте в файл:
<resources>
	<string name="com.google.firebase.crashlytics.mapping_file_id">none</string>
</resources>
В свойствах файла:
  • Установите Действие при компиляции → AndroidResource
В Platforms/Android/MainActivity.cs:
Добавьте using:
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using Plugin.Firebase.CloudMessaging;
Измените класс и добавьте:
protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    HandleIntent(Intent);
    CreateNotificationChannelIfNeeded();
}

protected override void OnNewIntent(Intent intent)
{
    base.OnNewIntent(intent);
    HandleIntent(intent);
}

private static void HandleIntent(Intent intent)
{
    FirebaseCloudMessagingImplementation.OnNewIntent(intent);
}

private void CreateNotificationChannelIfNeeded()
{
    if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
    {
        CreateNotificationChannel();
    }
}

private void CreateNotificationChannel()
{
    var channelId = $"{PackageName}.general";
    var notificationManager = (NotificationManager)GetSystemService(NotificationService);
    var channel = new NotificationChannel(channelId, "General", NotificationImportance.Default);
    notificationManager.CreateNotificationChannel(channel);
    FirebaseCloudMessagingImplementation.ChannelId = channelId;
    FirebaseCloudMessagingImplementation.SmallIconRef = Resource.Drawable.splash;
}
В MauiProgram.cs:
Добавьте using:
using Plugin.Firebase.Auth;
using Plugin.Firebase.Bundled.Shared;
using Microsoft.Extensions.Logging;
using Plugin.Firebase.Crashlytics;
using Microsoft.Maui.LifecycleEvents;
Перед namespace вставьте условную компиляцию:
#if IOS
using Plugin.Firebase.Bundled.Platforms.iOS;
#else
using Plugin.Firebase.Bundled.Platforms.Android;
#endif
Ниже метода CreateMauiApp добавьте:
private static MauiAppBuilder RegisterFirebaseServices(this MauiAppBuilder builder)
{
    builder.ConfigureLifecycleEvents(events =>
    {
#if IOS
        events.AddiOS(iOS => iOS.FinishedLaunching((app, launchOptions) => {
            CrossFirebase.Initialize(CreateCrossFirebaseSettings());
            return false;
        }));
#else
        events.AddAndroid(android => android.OnCreate((activity, _) =>
            CrossFirebase.Initialize(activity, CreateCrossFirebaseSettings())));
        CrossFirebaseCrashlytics.Current.SetCrashlyticsCollectionEnabled(true);
#endif
    });

    builder.Services.AddSingleton(_ => CrossFirebaseAuth.Current);
    return builder;
}

private static CrossFirebaseSettings CreateCrossFirebaseSettings()
{
    return new CrossFirebaseSettings(
        isAuthEnabled: true,
        isCloudMessagingEnabled: true,
        isAnalyticsEnabled: true
    );
}
В Platforms/Android/AndroidManifest.xml:
Откройте в режиме текста (правый клик > Открыть с помощью > Редактор XML)
Между тегами <application>...</application> добавьте:
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
	<intent-filter>
		<action android:name="com.google.android.c2dm.intent.RECEIVE" />
		<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
		<category android:name="${applicationId}" />
	</intent-filter>
</receiver>
В MainPage.xaml.cs:
Добавьте:
using Plugin.Firebase.CloudMessaging;
Удалите содержимое OnCounterClicked, замените на async и вставьте:
await CrossFirebaseCloudMessaging.Current.CheckIfValidAsync();
var token = await CrossFirebaseCloudMessaging.Current.GetTokenAsync();
Поставьте точку останова на строку с token, запустите приложение, нажмите кнопку, скопируйте token и сохраните его в token.txt.
Перейдите в Firebase → Messaging → Создать кампанию:
  • Выберите "Уведомления Firebase"
  • Введите данные уведомления
  • В разделе "Тестовое сообщение" вставьте токен
  • Нажмите "Отправить"
Отправка уведомлений из App Clientes
Создайте новый MAUI-проект на .NET 8
Установите NuGet:
FirebaseAdmin версии 2.4.1
Переместите файлы:
  • token.txt → в Resources/Raw
  • В Firebase: Настройки → Учетные записи → Создать приватный ключ → скачать → переименовать в admin_sdk.json, также поместить в Resources/Raw
В MainPage.xaml.cs:
  • Добавьте:
using FirebaseAdmin;
using FirebaseAdmin.Messaging;
using Google.Apis.Auth.OAuth2;
  • Добавьте методы:
private async Task<string> GetToken()
{
    var stream = await FileSystem.OpenAppPackageFileAsync("token.txt");
    var reader = new StreamReader(stream);
    return reader.ReadToEnd();
}

private async void ReadFireBaseAdminSdk()
{
    var stream = await FileSystem.OpenAppPackageFileAsync("admin_sdk.json");
    var reader = new StreamReader(stream);
    var jsonContent = reader.ReadToEnd();

    if (FirebaseMessaging.DefaultInstance == null)
    {
        FirebaseApp.Create(new AppOptions()
        {
            Credential = GoogleCredential.FromJson(jsonContent)
        });
    }
}
В OnCounterClicked вставьте:
string _deviceToken = Convert.ToString(await GetToken());
var androidNotificationObject = new Dictionary<string, string>
{
    { "NavigationID", "2" }
};

var obj = new Message
{
    Token = _deviceToken,
    Notification = new Notification
    {
        Title = "Title",
        Body = "Message Body"
    },
    Data = androidNotificationObject,
};

var response = await FirebaseMessaging.DefaultInstance.SendAsync(obj);
После InitializeComponent(); вызовите ReadFireBaseAdminSdk();
Создайте класс PushNotificationRequest.cs:
public class PushNotificationRequest
{
    public List<string> registration_ids { get; set; } = new List<string>();
    public NotificationMessageBody notification { get; set; }
    public object data { get; set; }
}

public class NotificationMessageBody
{
    public string title { get; set; }
    public string body { get; set; }
}
Готово
После запуска приложения нажмите кнопку — должно прийти уведомление на устройство.