Как настроить ежедневное локальное уведомление для задач, но не показывать его, когда пользователь завершает задачу раньше - PullRequest
0 голосов
/ 18 апреля 2020

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

Я пытаюсь получать ежедневные напоминания о ежедневных задачах из моего приложения, если пользователь еще не завершил его, так как я могу сделать так, чтобы оно не показывалось когда он уже выполнил задание?

Решения, которые я нашел до сих пор, предлагают удалить ожидающие уведомления и настроить новое для будущей даты в то же время.

Я успешно настроил ежедневные уведомления используя этот код:

    func sendDailyReminder() {
        let content = UNMutableNotificationContent()
        content.title = "Daily reminder"
        content.body = "You still have task to complete today."
        content.sound = UNNotificationSound.default
        var dateComponents = DateComponents()
        dateComponents.hour = 20
        dateComponents.minute = 00
        let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)
        let request = UNNotificationRequest(identifier: "dailyTrigger", content: content, trigger: trigger)

        center.add(request) { (error) in
            if let error = error {
                print("Notification Error: ", error)
            }
        }
    }

я также могу успешно удалить ожидающие уведомления с помощью метода removePendingNotificationRequest, но как я могу настроить триггер на завтра с использованием dateComponents здесь?

Или есть какой-либо другой способ достичь этого? Может быть, использовать фоновую выборку, чтобы проверить, выполнено ли это непосредственно перед отправкой уведомления?

Некоторые ответы, которые я обнаружил, предполагают, что это на самом деле невозможно, но тогда как любая задача или приложение для выполнения задач может достичь чего-то подобного?

1 Ответ

0 голосов
/ 20 апреля 2020

В итоге я использовал несколько уведомлений для каждого дня недели, но настроил его немного по-другому:

Сначала настроил ежедневное напоминание, используя в качестве идентификатора Weekday Int

func setWeekdayReminder(weekday: Int) {
        let center = UNUserNotificationCenter.current()
        let content = UNMutableNotificationContent()
        content.title = "Daily reminder"
        content.body = "You still have some tasks to complete today."
        content.sound = UNNotificationSound.default
        var dateComponents = DateComponents()
        dateComponents.hour = 18
        dateComponents.minute = 35
        dateComponents.weekday = weekday
        let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true
        let request = UNNotificationRequest(identifier: String(weekday), content: content, trigger: trigger)

        center.add(request) { (error) in
            if let error = error {
                print("Notification Error: ", error)
            }
        }
    }

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

func checkDailyReminder() {

       let currentWeekday = Calendar.current.component(.weekday, from: Date())

       center.getPendingNotificationRequests { (requests) in
            var weekdayArray : [Int] = []

            for each in requests {
               weekdayArray.append(Int(each.identifier)!)
            }
            for number in 1...7 {
                if weekdayArray.contains(number) {
                    print("weekdayArray contains weekday \(number)")
                } else {
                    print("weekdayArray doesnt contain weekday \(number)")
                    if number != currentWeekday {
                          self.setWeekdayReminder(weekday: number)
                    }
                }
            }

        }
    }

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

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