Вопрос или проблема
Проблема с уведомлениями iOS ‘Awesome Notification’ в Flutter: уведомление повторяется на переднем плане, появляется только один раз на заднем плане.
Я хочу, чтобы уведомление повторялось каждые 7 секунд, как я и закодировал. На iOS оно работает, как ожидалось, на переднем плане, но на заднем плане уведомление появляется только один раз и исчезает. Поскольку это приложение для будильника, мне нужно, чтобы уведомление продолжало повторяться, пока пользователь не кликнет на него, даже на заднем плане. Ниже приведен код, который я написал.
static void initializeNotificationListeners() {
print('Инициализация слушателей уведомлений');
AwesomeNotifications().setListeners(
onActionReceivedMethod: onActionReceivedMethod,
onNotificationDisplayedMethod: onNotificationDisplayedMethod,
);
print('Слушатели уведомлений установлены');
}
static Future<void> onNotificationDisplayedMethod(ReceivedNotification receivedNotification) async {
_notificationTimer?.cancel();
_notificationTimer = Timer.periodic(Duration(seconds: 7), (timer) async {
int? subId = int.tryParse(receivedNotification.payload?['subId'] ?? '');
await AwesomeNotifications().createNotification(
content: NotificationContent(
criticalAlert: true,
displayOnBackground: true,
displayOnForeground: true,
fullScreenIntent: true,
id: subId!,
channelKey: "alarm_Category",
title: 'Напоминание о будильнике',
body: 'Ваш будильник все еще активен!',
autoDismissible: false,
payload: receivedNotification.payload,
),
);
});
}
.
Ответ или решение
Вопрос, с которым вы столкнулись – это проблема с уведомлениями в iOS с использованием библиотеки "Awesome Notifications" в Flutter. Ваша задача заключается в том, чтобы уведомления корректно отображались как в фоновом, так и в активном (foreground) режимах, с учетом определенных функциональных требований. На данный момент, вы наблюдаете, что уведомление повторяется каждые 7 секунд в активном режиме, но в фоновом режиме появляется только один раз и затем исчезает.
Проблема
Необходимо отметить, что iOS имеет строгие ограничения относительно фона работы приложений и уведомлений. Имея это в виду, подход "прослушивания уведомлений" с периодическим повторением через таймер может вести себя по-разному в зависимости от состояния приложения:
- Находится ли приложение в активном состоянии: Уведомления могут отображаться без ограничений, как показано в вашем коде.
- В фоновом режиме: Система может не позволить вашему приложению создавать постоянные уведомления, поскольку iOS предполагает, что приложение не должно отвлекать пользователя.
Предложения по решению
Чтобы решить вашу проблему, вот несколько рекомендаций, которые помогут вам обеспечить повторное отображение уведомлений в фоновом режиме на iOS.
-
Используйте локальные уведомления с напоминанием:
Рассмотрите возможность использования локальных уведомлений с заданным временным интервалом. Вместо того чтобы полагаться на таймер в вашем приложении, настройте локальные уведомления для создания их через каждые 7 секунд в фоновом режиме. Настройка этого функционала потребует, чтобы вы использовалиrequestPermission()
для получения необходимых разрешений от пользователя и учли политику iOS, касающуюся фона. -
Проверка критических уведомлений:
ПараметрcriticalAlert: true
в вашем коде указывает на использование критических уведомлений, что позволяет такой функционал, однако убедитесь, что ваше приложение соблюдает условия использования критических уведомлений и предварительно одобрено в App Store. -
Добавьте логику для управления уведомлениями:
Вместо использования таймера для создания уведомлений, вы можете создать функцию, которая будет запускаться при конкретных событиях (например, нажатии на уведомление), чтобы заново запланировать уведомления с помощьюschedule()
метода в библиотеке “Awesome Notifications”. -
Используйте Background Fetch:
ЗадействуйтеBackground Fetch
, который может помочь с обработкой событий в фоновом режиме. Хотя это не гарантирует точное выполнение задачи, это может помочь вашему приложению поддерживать некоторую логику в фоновом режиме.
Обновленный механизм уведомлений
Примерно следующим образом могут выглядеть корректировки вашего кода:
void setupBackgroundNotifications(int subId) {
AwesomeNotifications().createNotification(
content: NotificationContent(
criticalAlert: true,
displayOnBackground: true,
id: subId,
channelKey: "alarm_Category",
title: 'Alarm Reminder',
body: 'Your alarm is still active!',
autoDismissible: false,
payload: {'subId': subId.toString()},
),
);
}
static Future<void> onNotificationDisplayedMethod(ReceivedNotification receivedNotification) async {
int? subId = int.tryParse(receivedNotification.payload?['subId'] ?? '');
Timer.periodic(Duration(seconds: 7), (timer) {
setupBackgroundNotifications(subId!);
});
}
Заключение
Решение вашей проблемы требует пересмотра механизма работы с уведомлениями в iOS. Основной акцент стоит делать на использование локальных уведомлений с правильными интервалами и ограничениями, установленными системой, а также на правильном управлении событиями, чтобы поддерживать функциональность вашего приложения в фоновом режиме. Убедитесь, что все ваши уведомления соответствуют рекомендациям Apple и проходят необходимые проверки для работы с фоновыми функциями.