Swift: 静音当天的通知
Swift: Mute notifications for current day
在我的应用程序中,我每天发送一条通知来提醒用户访问该应用程序。
此通知每天下午 1 点在本地发送。
func scheduleNotifications() -> Void {
for notification in notifications {
let content = UNMutableNotificationContent()
content.title = notification.title
let todaysDate = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd"
let currentDay = dateFormatter.string(from: todaysDate)
let currentDayInt = Int(currentDay) ?? 0
var datComp = DateComponents()
datComp.hour = 13
datComp.minute = 00
datComp.day = currentDayInt + 1
let trigger = UNCalendarNotificationTrigger(dateMatching: datComp, repeats: true)
let request = UNNotificationRequest(identifier: notification.id, content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) { error in
guard error == nil else { return }
print("Scheduling notification with id: \(notification.id) on Day \(datComp.day ?? 00) at \(datComp.hour ?? 00) - \(datComp.minute ?? 00)")
}
}
}
如您所见,我添加了 "current day + 1" 行,因为如果用户在下午 1 点之前打开应用程序,则无需在这一天发送通知。
所以每次用户打开应用程序时,我都会使用 UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
删除通知并重新安排第二天的通知(通过调用上面的功能)。
我的问题:
只要用户打开应用程序,通知就应该每天重复,它确实如此。
但是如果用户某一天没有打开应用,那么接下来的几天将不会有任何通知。
有没有办法让当天的通知静音,这样我就不必使用这个 "current day + 1" 东西了?或者谁有更好的主意?
谢谢大家。
我认为您误解了重复通知和您的 datComp 在这里的工作原理。
例如(让我们使用今天的日期:5 月 27 日)
datComp.hour = 13
datComp.minute = 00
datComp.day = currentDayInt + 1 // in our example it's 28
let trigger = UNCalendarNotificationTrigger(dateMatching: datComp, repeats: true)
表示您的通知将在每个月的 28 日触发,您的触发器知道的所有参数都是小时、分钟、天,并且通过重复它,将在每 28 日 13:00 触发。
所以您的应用程序现在的工作方式是您设置从明天开始的每月通知,当您打开该应用程序时,您将删除该每月通知并重新安排一天后。通过每天打开,它给您的印象是它的每日通知,但它不是,它是每月的。这就是为什么如果您不打开应用程序,第二天什么也不会显示,它会在下个月出现。
你可以在这里查看我的类似解释:(那里的最佳答案,也许措辞更好,更容易理解)
以及我在这里遇到的类似问题的解决方案:
在我的应用程序中,我每天发送一条通知来提醒用户访问该应用程序。 此通知每天下午 1 点在本地发送。
func scheduleNotifications() -> Void {
for notification in notifications {
let content = UNMutableNotificationContent()
content.title = notification.title
let todaysDate = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd"
let currentDay = dateFormatter.string(from: todaysDate)
let currentDayInt = Int(currentDay) ?? 0
var datComp = DateComponents()
datComp.hour = 13
datComp.minute = 00
datComp.day = currentDayInt + 1
let trigger = UNCalendarNotificationTrigger(dateMatching: datComp, repeats: true)
let request = UNNotificationRequest(identifier: notification.id, content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) { error in
guard error == nil else { return }
print("Scheduling notification with id: \(notification.id) on Day \(datComp.day ?? 00) at \(datComp.hour ?? 00) - \(datComp.minute ?? 00)")
}
}
}
如您所见,我添加了 "current day + 1" 行,因为如果用户在下午 1 点之前打开应用程序,则无需在这一天发送通知。
所以每次用户打开应用程序时,我都会使用 UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
删除通知并重新安排第二天的通知(通过调用上面的功能)。
我的问题: 只要用户打开应用程序,通知就应该每天重复,它确实如此。 但是如果用户某一天没有打开应用,那么接下来的几天将不会有任何通知。
有没有办法让当天的通知静音,这样我就不必使用这个 "current day + 1" 东西了?或者谁有更好的主意?
谢谢大家。
我认为您误解了重复通知和您的 datComp 在这里的工作原理。
例如(让我们使用今天的日期:5 月 27 日)
datComp.hour = 13
datComp.minute = 00
datComp.day = currentDayInt + 1 // in our example it's 28
let trigger = UNCalendarNotificationTrigger(dateMatching: datComp, repeats: true)
表示您的通知将在每个月的 28 日触发,您的触发器知道的所有参数都是小时、分钟、天,并且通过重复它,将在每 28 日 13:00 触发。
所以您的应用程序现在的工作方式是您设置从明天开始的每月通知,当您打开该应用程序时,您将删除该每月通知并重新安排一天后。通过每天打开,它给您的印象是它的每日通知,但它不是,它是每月的。这就是为什么如果您不打开应用程序,第二天什么也不会显示,它会在下个月出现。
你可以在这里查看我的类似解释:(那里的最佳答案,也许措辞更好,更容易理解)
以及我在这里遇到的类似问题的解决方案: