Определить, было ли запущено локальное уведомление, когда приложение находилось в фоновом режиме / неактивно - PullRequest
1 голос
/ 15 мая 2019

Я реализую локальную функцию уведомлений со следующей целью:

Показать это уведомление, если пользователь не посещал экран 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 в течение еще одной недели.В конце этой недели пользователь получает уведомление снова .

1 Ответ

1 голос
/ 15 мая 2019

Когда пользователь касается или отклоняет уведомление, когда приложение находится в фоновом режиме (приостановлено) или прекращает работу, обратный вызов будет получен в следующем методе UNUserNotificationCenterDelegate.

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)

Если пользователь коснется и откроет приложение, response.actionIdentifier будет "UNNotificationDefaultActionIdentifier".

Если пользователь отклоняет запрос, нажимая кнопку «Очистить» в уведомлении или проводя влево по уведомлению, response.actionIdentifier будет «UNNotificationDismissActionIdentifier».

Таким образом, всякий раз, когда пользователь предпринимает какие-либо действия в уведомлении, когда приложение неактивно, оно будет получено в этом обратном вызове. Как и ожидалось, здесь можно запланировать 7-дневное локальное уведомление.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...