【问题标题】:Trigger UILocalNotification for every 14 days (fortnightly) Swift每 14 天(每两周)触发一次 UILocalNotification Swift
【发布时间】:2018-02-14 16:11:53
【问题描述】:

这个问题已经在 SO 上得到回答。这是参考:

iOS Notification Trigger: fortnightly and/or quarterly

但到目前为止,我已经尝试过:

var fortnightPart1 = DateComponents()
fortnightPart1.weekday = Calendar.current.component(.day, from: Sdate) //(Day..here Sunday)
fortnightPart1.weekdayOrdinal = 2 //= n == (nth Day in the month...here 2nd Sunday in every month month)
fortnightPart1.hour = Calendar.current.component(.hour, from: Sdate)
fortnightPart1.minute = Calendar.current.component(.minute, from: Sdate)
fortnightPart1.second = Calendar.current.component(.second, from: Sdate)
trigger = UNCalendarNotificationTrigger(dateMatching: fortnightPart1, repeats: repeate)

我无法在 14 天后实现它。虽然,它来自随机数据。有人可以检查代码有什么问题吗?

更新:

根据您的建议 (https://stackoverflow.com/a/46072497/7408802),这是最终的有效代码!

//for 1st time notification
 let center = UNUserNotificationCenter.current()
 let content = UNMutableNotificationContent()
 content.title = title
 content.body = body
 content.categoryIdentifier = "\(id)"
 content.sound = UNNotificationSound.default()
 fortnightPart1.hour = Calendar.current.component(.hour, from: dateToFireON)
 fortnightPart1.minute = Calendar.current.component(.minute, from: dateToFireON)
 fortnightPart1.second = Calendar.current.component(.second, from: dateToFireON)
 trigger = UNCalendarNotificationTrigger(dateMatching: fortnightPart1, repeats: false)
 content.userInfo = ["NotificationID": id,"repeate":repeate,"resedule":true]
 let request = UNNotificationRequest(identifier: "\(id)", content: content, trigger: trigger)
 center.add(request)

//when first notification triggered, we need to set another for 14 days repeat in UIApplicationDelegate
func application(_ application: UIApplication, didReceive notification: UILocalNotification) {
    let center = UNUserNotificationCenter.current()
    let content = UNMutableNotificationContent()
    content.title = notification.alertTitle!
    content.body = notification.alertBody!
    content.categoryIdentifier = "\(reminderId)"
    content.userInfo = ["NotificationID": reminderId,"repeate":true,"resedule":false]
    content.sound = UNNotificationSound.default()
    let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 1209600, repeats: true)
    let request = UNNotificationRequest(identifier:"\(reminderId)", content: content, trigger: trigger)
    center.add(request, withCompletionHandler: nil)
}

【问题讨论】:

  • repeate 的值是多少? random data 是什么意思?此外,您实际上需要什么?您需要在每个月的第二个星期日触发通知还是从设置后每两周触发一次?这两个要求根本不一样。
  • repeat 是一个布尔变量,从中决定重复功能。我希望从 sDate 开始每 2 周重复一次。

标签: swift3 calendar uilocalnotification unnotificationrequest unnotificationtrigger


【解决方案1】:

使用简单的UNNotificationTriggers 无法实现您想要实现的目标。对于每两周重复一次的通知,您需要设置一个UNTimeIntervalNotificationTrigger 和一个相当于两周的timeInterval。但是,您不能指定时间间隔触发器的第一个触发日期,它会在您安排后立即开始“滴答”。

另一方面,UNCalendarNotificationTrigger 可以安排在特定日期触发,但这样做的问题是您无法为通知触发器指定自定义重复间隔。

您需要首先为用户指定的日期设置一个不重复的UNCalendarNotificationTrigger,并在发送通知后设置一个每两周触发一次的UNTimeIntervalNotificationTrigger。这种方法的唯一问题是用户也会在指定日期看到通知,而不仅仅是在那之后的每两周一次。但是,您可以通过将通知设置为在指定日期后两周发送通知来规避此问题,这样用户就不会注意到通知之间的差异。

【讨论】:

  • 您能否检查更新后的问题,或者我应该提供演示,您能否检查并使其按预期工作?
  • 不用担心,很高兴我能帮上忙。
  • 对于双周,您可以安排两个每周重复的通知
  • @pnavk 你误解了双周一次,OP 明确要求每两周一次,而不是每周两次
【解决方案2】:

@David 的回答非常正确。我想在这里添加一件事。如果用户不会点击通知,则您无法安排其他通知。您可以为此使用后台获取。如果 IOS 触发后台获取,则检查当前日期与您的计划日期并生成新通知。

【讨论】:

  • 能否请您在后台获取部分添加一个示例?据我所知,系统会自行决定何时发生后台提取并且您无法安排它,所以我不知道如何在这里使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多