【问题标题】:How to set up daily local notification for tasks but don't show it when user completes the task before如何为任务设置每日本地通知,但在用户完成任务之前不显示
【发布时间】:2020-08-01 01:16:16
【问题描述】:

我知道以前出现过类似的问题,但我认为我需要进一步澄清,因为我仍然不知道如何完成。我是初学者,如有错误请见谅。

如果用户尚未完成,我正在尝试从我的应用中获得日常任务的每日提醒,那么当他已经完成任务时,我怎样才能让它不显示呢?

到目前为止,我发现的解决方案建议删除待处理通知并同时为将来的日期设置新通知。

我使用此代码成功设置了每日通知:

    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 为明天设置触发器?

或者还有其他方法可以实现吗?也许使用后台获取来检查它是否在发送通知之前完成?

我发现一些回复表明这实际上是不可能的,但是任何任务或待办事项应用程序如何实现这样的目标?

【问题讨论】:

  • 你不能设置一个重复通知,然后当任务完成后,取消通知?
  • 是的,这就是我尝试做的,但如何设置第二天的通知?这是一个示例:每天晚上 8 点有提醒,用户在晚上 7 点完成任务,我取消通知然后我必须为第二天设置新通知,它不能简单地是相同的通知,因为那样它会显示相同无论如何,对吧?如何设置第二天的新通知?那是我不知道该怎么做的部分
  • 您可能需要安排多个通知;一周中的每一天。然后,当任务完成后,您可以取消当天的通知。
  • 据我了解,您需要做两件事:a) 在任务已经完成时不要调用此方法,以及 b) 当任务的状态从打开完成。
  • @Paulw11 我想过,这似乎是一个好方法,但我又觉得我缺少一些知识来实现​​它。如何设置下周失踪的日子?如果每天有 7 个重复通知并且我取消了那一天,那么在某些时候必须重新设置它,在这里我会回到与以前相同的问题。

标签: ios swift usernotifications


【解决方案1】:

我最终在每个工作日使用多个通知,但设置方式略有不同:

首先使用 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)
                    }
                }
            }

        }
    }

当然,这是一种黑客行为,当用户完成任务并且以某种方式不会返回一周并在同一工作日再次打开它时,他将不会在当天收到通知,但它适用于其余的时间。

【讨论】:

  • 从那以后你找到更好的解决方案了吗?
  • 不抱歉,没仔细研究,可能最近iOS更新有一些处理通知的新方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多