【问题标题】:Repeat Notifications monthly on specific day每月在特定日期重复通知
【发布时间】:2023-03-28 08:57:02
【问题描述】:

我想在特定日期每月重复通知,但我担心的是,如果用户选择 31 怎么办?那么通知只会每两个月触发一次,而不会在二月触发? 因为天组件不匹配。

是否可以将日期设置为该月的最后一天,例如,当 2 月是下个月并且用户选择 31 时,它会在 2 月的最后一天触发?

我可以采用非重复方式并手动添加通知,但我将不得不面对 64 个预定通知的限制。

提前感谢您的帮助。

【问题讨论】:

  • 我们遇到了同样的问题。无法在重复模式下使用它。如果您想在最后一个日期触发通知,您需要手动设置它。对于 64 位限制,您可以在用户打开应用时更新通知,每天一次或每月更新一次。

标签: ios swift usernotifications


【解决方案1】:

Calendar 模块是要走的路。手动处理日期会变得非常棘手。

import Calendar

let selectedDate = "31/01/2020"

// Convert string to Date
let dateF = DateFormatter()
dateF.dateFormat = "dd/MM/yyyy"
let myDate = dateF.date(from: selectedDate)!

// Advancing date by a month, to get end of next month.
Calendar.current.date(byAdding: .month, value: 1, to: myDate)  // "Feb 29, 2020 at 12:00 AM"

在上面的示例中,您可以看到如何将日期提前一个月。

如果用户选择一个月的 31 号,日历会自动准确计算下个月的月底,即使它只有 28、29、30 或 31 天。

【讨论】:

  • 您的答案很好,但它有一个缺陷,当您继续向日期添加月份时,在您的示例中,如果您在最后一个日期(即 2 月 29 日)上再添加一个月,则为下一个日期将是 3 月 29 日,这不是月底。
  • 不一定。如果你这样做怎么办:Calendar.current.date(byAdding: .month, value: 2, to: myDate) // "Mar 31, 2020 at 12:00 AM" Calendar.current.date(byAdding: .month, value: 3, to: myDate) // "Apr 30, 2020 at 12:00 AM"
【解决方案2】:

一种选择是使用远程通知并在服务器上处理它们。这将涉及更多工作和服务器,但它更灵活,允许您更改通知,而无需用户更新应用程序。链接到Remote Notifications 的 Apple Doc。

另一个选项是使用Calendar

当您按照逻辑发送通知时,您可以测试今天是否是该月的最后一天。如果用户选择在 31 日收到通知,并说今天是该月的最后一天,也是 30 日,您仍然可以发送通知,因为您知道该特定月份没有 31 日。

【讨论】:

  • 我也是这么想的,我已经有一个函数可以在这些情况下计算正确的日期,但是这样我必须手动安排通知,然后我必须面对 64 个限制。如果我可以使用'UNCalendarNotificationTrigger(dateMatching:calendarComponents,repeats:true)',因为重复的通知算作一个。
  • @ElliotCzigány 今年只有 12 个月,您真的需要在那之后安排通知吗?
  • 您可能需要走多条通知路线。但不要一次添加所有这些。也许只需要提前几个月。您可以随时致电removeAllDeliveredNotifications()。这应该可以让您摆脱限制。我没有用过,所以你可能需要在那里做一些调查。
  • @Derek 并非所有的日子都从午夜开始,所以如果你在凌晨 1 点加一天并减去 1 秒,它就不会工作
  • @LeoDabus 是的,我还是删除了它,因为它与问题无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多