【问题标题】:How to trigger local notification fortnightly starting from a specific future date如何从特定的未来日期开始每两周触发一次本地通知
【发布时间】:2017-05-31 10:52:35
【问题描述】:

我正在尝试每两周触发一次UNUserNotification,这将从未来的特定日期开始。我已经用UNTimeIntervalNotificationTrigger 成功触发了。但我的问题是我无法在这里设置具体的开始日期。

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

我已经用WeekdayOrdinal 尝试过UNCalendarNotificationTrigger,但这并不总是适用于两周的持续时间。

我有什么办法可以从未来的特定日期开始每两周安排一次本地 UNUserNotification

【问题讨论】:

    标签: ios ios10 localnotification unusernotificationcenter


    【解决方案1】:

    UNNotificationRequest 不提供任何东西来触发两周重复。

    使用UNCalendarNotificationTrigger,您只能触发以下类型的重复:

    weekly, daily, monthly, yearly

    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
        }
    

    尽管您可以轻松地使用 EventKit 在这些事件中创建事件和警报,并使用您想要的所有此类重复选项(例如每两周、每季度、每半年等)。

    我创建了这段代码来创建具有多种重复类型的事件:

    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")
            }
        })
    

    请不要忘记导入EventKit

    【讨论】:

    • UNNotificationRequest 不提供该功能,这就是我解释EvenKit 选项的原因。
    【解决方案2】:

    试试triggerWithDateMatchingComponents方法

    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 示例

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

    【讨论】:

    • 这只能触发一次...如何让它自动?
    猜你喜欢
    • 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
    相关资源
    最近更新 更多