Я реализую локальную функцию уведомлений со следующей целью:
Показать это уведомление, если пользователь не посещал экран X в течение по крайней мере 7 дней. Отображать его только один раз , даже если пользователь не посещает экран X снова после первого отображения уведомления.
Моя текущая стратегия состоит в том, чтобы запланировать отправку уведомленияЧерез 7 дней после первого запуска пользователь запускает приложение.Затем, если пользователь посещает экран X до этих 7 дней, я перенесу это уведомление, которое фактически сбрасывает таймер еще на 7 дней.Я использую пользовательский класс (NotificationManager
) для управления настройкой и расписанием уведомлений.Вы можете предположить, что реализация NotificationManager
не содержит ошибок.
Это мой AppDelegate.swift :
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// notification was never shown to the user
if firstEverAppLaunch {
NotificationManager.shared.schedule(notificationWithIdentifier: "remindUserToVisitScreenX")
}
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
if notification.request.identifier == "remindUserToVisitScreenX" {
UserDefaults.standard.set(true, forKey: "doNotShowNotificationAgain")
}
}
ScreenXController.swift
//.. some uninteresting code
override func viewWillAppear() {
// if user notification has never been shown, reschedule (i.e. reset) notification
if !UserDefaults.standard.bool(forKey: "doNotShowNotificationAgain") {
NotificationManager.shared.schedule(notificationWithIdentifier: "remindUserToVisitScreenX")
}
{
Моя текущая реализация работает почти правильно, вызывая функцию willPresent notification
.Однако, если уведомление приходит, когда приложение находится в фоновом режиме или неактивно, willPresent
не будет вызвано, и, следовательно, приложение не сможет выполнить требование, чтобы уведомление отображалось только один раз в течение всего времени жизни.приложение.
Пример:
Пользователь не посещает экран X в течение недели.Уведомление срабатывает, когда приложение неактивно.Пользователь отклоняет уведомление, а затем запускает приложение, не посещая экран X в течение еще одной недели.В конце этой недели пользователь получает уведомление снова .