Какой у тебя опыт работы с push-уведомлениями в Flutter?

«Какой у тебя опыт работы с push-уведомлениями в Flutter?» — вопрос из категории Платформенное взаимодействие, который задают на 28% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

У меня есть опыт полного цикла интеграции push-уведомлений в Flutter-приложения, от настройки до глубокой кастомизации обработки.

1. Базовая настройка с Firebase Cloud Messaging (FCM): Я настраивал FCM для проектов на Android, iOS и Web.

  • Добавление конфигурационных файлов (google-services.json, GoogleService-Info.plist).
  • Настройка entitlements и capabilities для iOS (Push Notifications, Background Modes).
  • Реализация запроса разрешений с учётом платформенных особенностей.
    Future<void> requestPermissions() async {
    FirebaseMessaging messaging = FirebaseMessaging.instance;
    NotificationSettings settings = await messaging.requestPermission(
    alert: true,
    badge: true,
    sound: true,
    );
    if (settings.authorizationStatus == AuthorizationStatus.authorized) {
    print('Разрешение получено');
    }
    }

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

// 1. Foreground
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
  // Показываем своё уведомление, т.к. системное не появится.
  showLocalNotification(message);
});

// 2. Background/Терминировано (требуется статический/глобальный обработчик)
@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  // Инициализируем Firebase в изоляте.
  await Firebase.initializeApp();
  // Обрабатываем данные уведомления.
  handleNotificationData(message.data);
}
// Регистрируем обработчик в main()
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

3. Глубокие ссылки и кастомные действия: Я использовал пакет flutter_local_notifications для отображения кастомных уведомлений с действиями (actions) и передавал в payload данные для навигации внутри приложения.

// При инициализации канала уведомлений добавляем действия.
const AndroidNotificationDetails androidDetails = AndroidNotificationDetails(
  'channel_id',
  'Channel Name',
  actions: [
    AndroidNotificationAction('reply', 'Ответить', showsUserInterface: true),
  ],
);
// При тапе на уведомление или действие извлекаем payload и перенаправляем пользователя.

4. Тестирование и отладка: Я использовал консоль Firebase, Postman для отправки тестовых уведомлений и тщательно логировал токены устройств и статусы доставки для отладки проблем, особенно на iOS (сертификаты APNs).