Как настроить Push-уведомления в Xamarin?

Настройка Push-уведомлений в Xamarin.Forms требует взаимодействия с внешними службами доставки сообщений (например, Firebase Cloud Messaging (FCM) для Android и Apple Push Notification Service (APNS) для iOS), а также реализации платформенно-зависимой логики на уровне нативных проектов. Общая архитектура включает регистрацию устройства, получение токена, обработку уведомлений и, при необходимости, взаимодействие с сервером для отправки уведомлений.

Общая схема работы Push-уведомлений

  1. Регистрация устройства — приложение получает уникальный токен от FCM (Android) или APNS (iOS).

  2. Отправка токена на сервер — бэкенд сохраняет токен устройства для последующей доставки сообщений.

  3. Отправка уведомления — сервер отправляет уведомление через API Firebase/APNS.

  4. Приём и отображение уведомления — приложение отображает уведомление в фоне или обрабатывает в активном режиме.

Настройка Push-уведомлений для Android

1. Создание проекта в Firebase

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

  2. Создайте проект.

  3. Перейдите в Cloud Messaging.

  4. Получите Server Key и Sender ID.

  5. Добавьте Android-приложение:

    • Укажите Package Name (например, com.companyname.appname)

    • Скачайте google-services.json

    • Добавьте его в корень проекта YourApp.Android.

2. Настройка проекта Xamarin.Android

Установка пакета:

Добавьте NuGet:

  • Xamarin.Firebase.Messaging

Изменение AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application>
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="default" />
&lt;service android:name="com.google.firebase.messaging.FirebaseMessagingService" /&gt;
<service android:name="com.google.firebase.iid.FirebaseInstanceIdService"
android:exported="true"/>
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
android:exported="false" />
&lt;/application&gt;

Настройка FirebaseService:

\[Service(Exported = true)\]
\[IntentFilter(new\[\] { "com.google.firebase.MESSAGING_EVENT" })\]
public class MyFirebaseMessagingService : FirebaseMessagingService
{
public override void OnMessageReceived(RemoteMessage message)
{
var body = message.GetNotification()?.Body ?? message.Data\["message"\];
// Обработка уведомления
ShowNotification(body);
}
void ShowNotification(string message)
{
var builder = new NotificationCompat.Builder(this, "default")
.SetContentTitle("Новое сообщение")
.SetContentText(message)
.SetSmallIcon(Resource.Drawable.icon);
var notificationManager = NotificationManagerCompat.From(this);
notificationManager.Notify(0, builder.Build());
}
public override void OnNewToken(string token)
{
// Отправить токен на сервер
}
}
#### **Регистрация канала уведомлений (Android 8+):**
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
var channel = new NotificationChannel("default", "Default", NotificationImportance.High);
var manager = (NotificationManager)GetSystemService(NotificationService);
manager.CreateNotificationChannel(channel);
}

Настройка Push-уведомлений для iOS

1. Настройка App ID и сертификатов

  1. Перейдите в Apple Developer.

  2. Создайте App ID с включенной опцией "Push Notifications".

  3. Создайте Push-сертификаты (Production или Development) через Keychain и загрузите в Apple Developer.

  4. Включите Push-уведомления в Capabilities проекта.

2. Добавьте Firebase в iOS-проект

  1. В Firebase добавьте приложение для iOS.

  2. Укажите Bundle Identifier.

  3. Скачайте GoogleService-Info.plist и добавьте в YourApp.iOS.

3. Добавьте NuGet и инициализируйте Firebase

Установите:

  • Xamarin.Firebase.iOS.CloudMessaging

AppDelegate.cs:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
Firebase.Core.App.Configure();
UNUserNotificationCenter.Current.Delegate = new MyUNUserNotificationCenterDelegate();
Messaging.SharedInstance.Delegate = new MyMessagingDelegate();
RegisterForPushNotifications();
return base.FinishedLaunching(app, options);
}
void RegisterForPushNotifications()
{
UNUserNotificationCenter.Current.RequestAuthorization(
UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound,
(granted, error) =>
{
if (granted)
InvokeOnMainThread(UIApplication.SharedApplication.RegisterForRemoteNotifications);
});
}

Обработка токена:

public class MyMessagingDelegate : MessagingDelegate
{
public override void DidReceiveRegistrationToken(Messaging messaging, string fcmToken)
{
// Отправить токен на сервер
}
}

Обработка входящих уведомлений:

public class MyUNUserNotificationCenterDelegate : UNUserNotificationCenterDelegate
{
public override void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, Action&lt;UNNotificationPresentationOptions&gt; completionHandler)
{
completionHandler(UNNotificationPresentationOptions.Alert | UNNotificationPresentationOptions.Sound);
}
}  

Отправка Push-уведомлений

Можно отправлять уведомления вручную через Post-запрос к FCM:

POST https://fcm.googleapis.com/fcm/send

{
"to": "DEVICE_TOKEN",
"notification": {
"title": "Заголовок",
"body": "Сообщение"
},
"data": {
"key1": "value1",
"key2": "value2"
}
}

Заголовки:

Authorization: key=YOUR_SERVER_KEY

Content-Type: application/json

Использование плагинов

1. Plugin.FirebasePushNotification (объединяет Android/iOS реализацию)

  • Устанавливается через NuGet.

  • Поддерживает получение уведомлений, темы, клики по уведомлениям.

Пример регистрации:

CrossFirebasePushNotification.Current.OnTokenRefresh += (s, p) =>
{
System.Diagnostics.Debug.WriteLine($"TOKEN : {p.Token}");
};
CrossFirebasePushNotification.Current.OnNotificationReceived += (s, p) =>
{
System.Diagnostics.Debug.WriteLine("Received");
};

Тестирование Push-уведомлений

  • На Android можно использовать Firebase Console или curl-запросы.

  • На iOS для тестов нужно использовать реальное устройство, так как симулятор не поддерживает Push.

  • Проверяйте наличие токена и интернет-доступа.

  • Убедитесь, что уведомления разрешены на уровне ОС.

Важные аспекты

  • У пользователей должно быть разрешение на получение уведомлений (особенно в iOS).

  • Поддерживайте обработку в фоне и в активном режиме.

  • Следите за обновлением токенов.

  • Храните токены на сервере и обновляйте при изменении.

  • На iOS нужно заботиться о сертификатах и Provisioning Profile.

Безопасность

  • Никогда не вшивайте Server Key в клиентское приложение.

  • Не передавайте Push-токены третьим лицам.

  • Используйте защищённые каналы между приложением и сервером.

Push-уведомления в Xamarin.Forms требуют конфигурации платформенных SDK (Firebase, APNS), настройки разрешений, получения токенов и их управления. Несмотря на сложность первоначальной настройки, после интеграции они становятся мощным инструментом взаимодействия с пользователями: от напоминаний и оповещений до триггерных событий и маркетинга.