简体   繁体   English

如何从特定的未来日期起每两周触发一次本地通知

[英]How to trigger local notification fortnightly starting from a specific future date

I am trying to trigger UNUserNotification fortnightly which will start from a specific future day. 我正在尝试每两周触发一次UNUserNotification ,这将从特定的未来日期开始。 I have triggered successfully with UNTimeIntervalNotificationTrigger . 我已经使用UNTimeIntervalNotificationTrigger成功触发了。 But my problem is I cannot set a specific start date here. 但是我的问题是我无法在此处设置特定的开始日期。

UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:(14*24*3600) repeats: YES];
request = [UNNotificationRequest requestWithIdentifier:identifier content:content trigger:trigger];

I've tried with WeekdayOrdinal for UNCalendarNotificationTrigger but that does not work exactly with fortnight duration always. 我已经尝试使用WeekdayOrdinal来进行UNCalendarNotificationTrigger但这并不总是与两周时间完全一样。

Is there any way I can schedule local UNUserNotification fortnightly from a specific day in future? 有什么办法可以让我从将来的特定日期每两周安排一次本地UNUserNotification

UNNotificationRequest does not provide anything to trigger fortnight recurring. UNNotificationRequest不提供任何触发两周重复的功能。

With UNCalendarNotificationTrigger you can only trigger following types of recurring: 使用UNCalendarNotificationTrigger您只能触发以下重复类型:

weekly , daily , monthly , yearly weeklydailymonthlyyearly

switch repeatType {
    case .daily:
        newComponents.hour = components.hour
        newComponents.minute = components.minute
        break
    case .weekly:
        newComponents.hour = components.hour
        newComponents.minute = components.minute
        newComponents.weekday = components.weekday
        break
    case .monthly:
        newComponents.hour = components.hour
        newComponents.minute = components.minute
        newComponents.day = components.day
        break
    case .none:
        newComponents.hour = components.hour
        newComponents.minute = components.minute
        newComponents.day = components.day
        newComponents.month = components.month
        newComponents.year = components.year
        break
    case .annually:
        newComponents.hour = components.hour
        newComponents.minute = components.minute
        newComponents.day = components.day
        newComponents.month = components.month
        break
    }

Although you can easily use EventKit to create events and alarms within those events with all such recurring options you want like the fortnight, quarterly, half-yearly etc. 尽管您可以轻松地使用EventKit在事件中创建事件和警报,并提供所有您想要的重复选项,例如每两周,每季度,每半年一次等。

I have created this code to create events with multiple recurring types: 我创建了以下代码来创建具有多种重复类型的事件:

let eventStore = EKEventStore()
    eventStore.requestAccess(to: .event, completion: { (granted, error) in
        if (granted) && (error == nil) {
            let event = EKEvent(eventStore: eventStore)
            event.title = "Countdown title"
            event.startDate = Date()
            event.notes = "Countdown is complete!"
            event.isAllDay = false

            event.calendar = eventStore.defaultCalendarForNewEvents

            var frequency : EKRecurrenceFrequency = EKRecurrenceFrequency.daily
            var interval = 1

            switch repeatType {
            case .daily:
                //Repeat every day
                frequency = EKRecurrenceFrequency.daily
                interval = 1
                break
            case .weekly:
                //Repeat every week
                frequency = EKRecurrenceFrequency.weekly
                interval = 1
                break
            case .biweekly:
                //Repeat every 2 weeks
                frequency = EKRecurrenceFrequency.weekly
                interval = 2
                break
            case .monthly:
                //Repeat every month
                frequency = EKRecurrenceFrequency.monthly
                interval = 1
                break
            case .quarterly:
                //Repeat every 3 months
                frequency = EKRecurrenceFrequency.monthly
                interval = 3
                break
            case .halfYearly:
                //Repeat every 6 months
                frequency = EKRecurrenceFrequency.monthly
                interval = 6
                break
            default:
                // Repeat every year
                frequency = EKRecurrenceFrequency.yearly
                interval = 1

            }
            let alarm : EKAlarm = EKAlarm(relativeOffset: TimeInterval(exactly: 0)!)
            event.addAlarm(alarm)

            if interval > 0 {
                event.addRecurrenceRule(EKRecurrenceRule(recurrenceWith: frequency, interval: interval, end: nil))
            }

            do {
                try eventStore.save(event, span: .thisEvent)
            } catch let error as NSError {
                print(error.localizedDescription)
                return
            }
        } else {
            print(error?.localizedDescription ?? "no error")
        }
    })

Please don't forget to import EventKit . 请不要忘记导入EventKit

Try with triggerWithDateMatchingComponents method 尝试使用triggerWithDateMatchingComponents方法

Objective-C Example Code Objective-C示例代码

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:86400]; // You can set your date here.
NSDateComponents *triggerDate = [[NSCalendar currentCalendar]   
              components:NSCalendarUnitYear +
              NSCalendarUnitMonth + NSCalendarUnitDay +
              NSCalendarUnitHour + NSCalendarUnitMinute +
              NSCalendarUnitSecond fromDate:date];

UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:triggerDate repeats:NO];

Swift Example 迅捷的例子

let triggerDate = Calendar.current.date(byAdding: .day, value: 1, to: self)!
let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDate, repeats: false)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM