【问题标题】:Making a Local notification that only repeats on a specific day制作仅在特定日期重复的本地通知
【发布时间】:2016-03-10 09:20:25
【问题描述】:

我正在为应仅在特定日期触发并在该天重复直到用户决定将其删除的应用程序处理本地通知。一个示例通知是在每周三上午 11:00 触发的。

当用户在时间选择器上按下完成时,触发 scheduleLocalNotification 功能。

    var sundayNotification : UILocalNotification!
    var mondayNotification : UILocalNotification!
    var tuesdayNotification : UILocalNotification!
    var wednesdayNotification : UILocalNotification!
    var thursdayNotification : UILocalNotification!
    var fridayNotification : UILocalNotification!
    var saturdayNotification : UILocalNotification!


func scheduleLocalNotification() {

        //Check the Dayname and match fireDate
        if dayName == "Sunday" {

            sundayNotification = UILocalNotification()

            //timeSelected comes from the timePicker i.e. timeSelected = timePicker.date
            sundayNotification.fireDate = fixNotificationDate(timeSelected)
            sundayNotification.alertTitle = "Sunday's Workout"
            sundayNotification.alertBody = "This is the message from Sunday's workout"
            sundayNotification.alertAction = "Snooze"
            sundayNotification.category = "workoutReminderID"
            let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
            appDelegate.saveContext()
            UIApplication.sharedApplication().scheduleLocalNotification(sundayNotification)


        } else if dayName == "Monday" {

            mondayNotification = UILocalNotification()
            mondayNotification.fireDate = fixNotificationDate(timeSelected)
            mondayNotification.alertTitle = "Monday's Workout"
            mondayNotification.alertBody = "This is the message from Monday's workout"
            mondayNotification.alertAction = "Snooze"
            mondayNotification.category = "workoutReminderID"
            let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
            appDelegate.saveContext()
            UIApplication.sharedApplication().scheduleLocalNotification(mondayNotification)

        } else if ..... }

}


func fixNotificationDate(dateToFix: NSDate) -> NSDate {


        let dateComponets: NSDateComponents = NSCalendar.currentCalendar().components([NSCalendarUnit.Hour, NSCalendarUnit.Minute], fromDate: dateToFix)

        dateComponets.second = 0

        if dayName == "Sunday" {

            dateComponets.weekday = 1 //n = 7

        } else if dayName == "Monday" {

            dateComponets.weekday = 2

        } else if dayName == "Tuesday" {

            dateComponets.weekday = 3

        } else if dayName == "Wednesday" {

            dateComponets.weekday = 4

        } else if dayName == "Thursday" {

            dateComponets.weekday = 5

        } else if dayName == "Friday" {

            dateComponets.weekday = 6

        } else if dayName == "Saturday" {

            dateComponets.weekday = 7

        }


        let fixedDate: NSDate! = NSCalendar.currentCalendar().dateFromComponents(dateComponets)

        return fixedDate
    }

在检查当天为通知分配正确的 UILocalNotification 之后,这仍然奇怪地不起作用,例如在不同的日子(周日上午 10:10 和周一上午 10:15)为通知设置不同的时间不会改变任何内容。通知仍然在我没有选择的那一天触发,即今天在这两个时间而不是那些日子。

关于我可能做错或遗漏的任何线索? 提前致谢。 :)

【问题讨论】:

  • 时间选择器是 NSDatePicker 吗?
  • 它是在其他日期触发还是仅在今天触发?
  • @D.Greg 仅限今天!我尝试将其设置为其他日期,但该测试没有成功。

标签: ios swift notifications


【解决方案1】:

经过一些工作,我想出了这个。我们首先将日期更改为用户选择的第一个触发日期。

func setNotificationDay(today: NSDate, selectedDay: Int) -> NSDate {
    let daysToAdd: Int!
    let calendar = NSCalendar.currentCalendar()
    let weekday = calendar.component(.Weekday, fromDate: today)

    if weekday > selectedDay {
        daysToAdd = (7 - weekday) + selectedDay
    } else {
        daysToAdd = (selectedDay - weekday)
    }

    let newDate = calendar.dateByAddingUnit(.Weekday, value: daysToAdd, toDate: today, options: [])

    return newDate! //if you don't have a date it'll crash
}

您可以只使用NSDate() 而不是要求它作为参数。我将把它留给你。

现在,我们需要设置通知。我没有对您的fixNotificationDate() 做任何事情,但您可以轻松添加它。这里的重点是设置notification.repeatInterval = .Weekday,不然就不会重复了。我还添加了一个字典来设置日期名称。这比像你一样重复代码要好。

它确实会创建对 NSCalendar 的第二次调用,但您可能会找到一种方法来避免在您的代码中这样做。

func scheduleLocalNotification(date: NSDate) {
    let dayDic = [1:"Sunday",
        2:"Monday",
        3:"Tuesday",
        4:"Wednesday",
        5:"Thursday",
        6:"Friday",
        7:"Saturday"]

    let calendar = NSCalendar.currentCalendar()
    let weekday = calendar.component(.Weekday, fromDate: date)

    let notification = UILocalNotification()
    notification.fireDate = date
    notification.repeatInterval = .Weekday
    notification.alertTitle = String(format: "%@'s Workout", dayDic[weekday]!)
    notification.alertBody = String(format: "This is the message from %@'s workout", dayDic[weekday]!)
    notification.alertAction = "Snooze"
    notification.category = "workoutReminderID"
    notification.soundName = UILocalNotificationDefaultSoundName
    UIApplication.sharedApplication().scheduleLocalNotification(notification)
}

这应该可以解决您的问题。我没有测试它,因为它至少需要一个星期! ;)

希望有帮助!

【讨论】:

  • 太棒了,感谢使用字典的 scheduleLocalNotification()。绝对是更好的方法。我已经设置了第一个通知并触发了它。 ;) 我会在接下来的一周里看看其他人的表现如何。非常感谢。
  • 没问题。很高兴能提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多