Планирование локального уведомления, когда приложение завершается - PullRequest
0 голосов
/ 15 мая 2019

Моя цель - создать локальное уведомление, которое будет срабатывать, если пользователь не запускал приложение в течение 2 недель. Я использую класс Manager для планирования локальных уведомлений приложения.

Это мое текущее решение:

func applicationWillTerminate(_ application: UIApplication) {
    NotificationManager.shared.schedule(notification)
}

Тем не менее, applicationWillTerminate вызываться не будет - и, следовательно, уведомление не будет запланировано - , если приложение завершается, пока оно находится в фоновом режиме (т.е. оно удаляется из дока) .

Есть ли обходные пути к этому?

Один из обходных путей, о котором я подумал, состоял в том, чтобы запланировать уведомление при каждом входе приложения в фоновый режим, а затем вызвать removePendingNotificationRequests(), если приложение снова станет активным, как показано ниже:

func applicationDidEnterBackground(_ application: UIApplication) {
    NotificationManager.shared.schedule(notification)
}

func applicationDidBecomeActive(_ application: UIApplication) {
   UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: ["notification"])
}

Проблема в том, что это кажется мне расточительным и неоптимальным решением. Есть ли более элегантное решение, чем планирование этого уведомления

Ответы [ 2 ]

2 голосов
/ 15 мая 2019

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

func applicationDidBecomeActive(_ application: UIApplication) { 
    UNUserNotificationCenter.current().removePendingNotificationRequests( withIdentifiers: ["notification"]
    NotificationManager.shared.schedule(notification)
}

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

0 голосов
/ 15 мая 2019

Я бы предложил текущий обходной путь, если вы не сказали, что на самом деле фоновый интерфейс для приложений ios, работающих в фоновом режиме, очень плохой, и нет никакой гарантии, что будет вызван applicationWillTerminate, даже если он останется в живых, пока не произойдет планирование,поскольку IOS всегда заботится о приложении, когда оно находится впереди, и почти отдает до 5 минут приложению, когда оно отправляется в фоновый режим, для завершения, и это будет значительно меньше, если пользователь открывает несколько приложений одновременно

Вы можете создать процесс выборки в фоновом режиме, чтобы запланировать его, пока приложение закрыто, но это будет иметь больше хлопот, чем текущий

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