UILocalNotification должен повторяться каждый будний день, но срабатывает и по выходным - PullRequest
10 голосов
/ 25 марта 2012

У меня есть UILocalNotification, которое должно срабатывать один раз в день, с понедельника по пятницу, но не в выходные. Я думал, что установка свойства repeatInterval уведомления для NSWeekdayCalendarUnit позволит это сделать. К сожалению для меня, мои уведомления все еще стреляют в выходные. Кто-нибудь может подсказать почему? Вот мой код:

UILocalNotification *localNotification = [[UILocalNotification alloc] init];

localNotification.alertAction = @"View";
localNotification.alertBody = NSLocalizedString(@"ALERT_MESSAGE", nil);
localNotification.soundName = UILocalNotificationDefaultSoundName;

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM-dd-yyyy HH:mm"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"America/Toronto"]];

// Notification fire times are set by creating a notification whose fire date 
// is an arbitrary weekday at the correct time, and having it repeat every weekday
NSDate *fireDate = [dateFormatter dateFromString:@"01-04-2012 11:00"]; 

localNotification.fireDate = fireDate;
localNotification.repeatInterval = NSWeekdayCalendarUnit;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
            break;

[localNotification release];

Ответы [ 4 ]

15 голосов
/ 25 марта 2012

День недели в iOS означает день недели.Он не имеет значения «рабочая неделя» в отличие от выходных.

В документации сказано, что это немного понятнее, предлагая использовать 1-7 в качестве единиц:

NSWeekdayCalendarUnit

Указывает единицу дня недели.

Соответствующее значение - kCFCalendarUnitSecond.Равно kCFCalendarUnitWeekday.Единицами дня недели являются числа от 1 до N (где для григорианского календаря N = 7, а 1 - воскресенье).

Источник: http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/Reference/NSCalendar.html

Чтобы правильно настроить уведомления отС понедельника по пятницу приведен скелетный код.Вам придется выполнить его 5 раз, поэтому было бы хорошо инкапсулировать его внутри метода, который задает параметры для fireDate.Я показал, как ты мог сделать это в понедельник.

UILocalNotification *notification = [[[UILocalNotification alloc] init] autorelease];

// Set this to an NSDate that is for the time you want, on Monday
notification.fireDate = fireDate;            

// Repeat every week
notification.repeatInterval = NSWeekCalendarUnit;
5 голосов
/ 05 апреля 2012

Вы должны установить день отдельно для локального уведомления и установить для локального уведомления repeatInterval значение NSWeekCalendar Unit.AS

            [self notificationWithItem:tempDict Date:[self SetDateForAlarmWithWeekday:2 :tempDict] andRepeatInterval:NSWeekCalendarUnit];
            [self notificationWithItem:tempDict Date:[self SetDateForAlarmWithWeekday:3 :tempDict]andRepeatInterval:NSWeekCalendarUnit];
            [self notificationWithItem:tempDict Date:[self SetDateForAlarmWithWeekday:4 :tempDict] andRepeatInterval:NSWeekCalendarUnit];
            [self notificationWithItem:tempDict Date:[self SetDateForAlarmWithWeekday:5 :tempDict] andRepeatInterval:NSWeekCalendarUnit];
            [self notificationWithItem:tempDict Date:[self SetDateForAlarmWithWeekday:6 :tempDict] andRepeatInterval:NSWeekCalendarUnit];

Здесь я сделал методы setDateForAlarmWithWeekday, которые возвращают дату, которая будет установлена ​​в свойстве fireDate локального Notification иtificationWithItem, устанавливающего локальное уведомление.и.

1 голос
/ 12 июня 2016

Похоже, но в Свифте.

Помните, что WeekDay начинается с 1 = воскресенье и продолжается до 7. См. Apple Docs: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDateComponents_Class/

func scheduleLocalNotification(date:NSDate, weekDay:Int){

        guard let calendar =  NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian),
    let groupName = dateFormatter?.stringFromDate(date) else { return }

        calendar.timeZone = NSTimeZone.defaultTimeZone()

        let dateComponents = NSDateComponents()
        dateComponents.calendar = calendar
        dateComponents.hour = calendar.component(.Hour, fromDate: date)
        dateComponents.minute = calendar.component(.Minute, fromDate: date)
        dateComponents.weekOfYear = calendar.component(.WeekOfYear, fromDate: date)
        dateComponents.weekday = weekDay

        let localNotificaion = UILocalNotification()
        localNotificaion.fireDate = calendar.dateFromComponents(dateComponents)
        localNotificaion.alertBody = "Hey!"
        localNotificaion.timeZone = NSTimeZone.defaultTimeZone()
        localNotificaion.userInfo = ["Time": groupName]
        localNotificaion.repeatInterval = .WeekOfYear
        UIApplication.sharedApplication().scheduleLocalNotification(localNotificaion)

}
1 голос
/ 11 марта 2014

Я также искал об этом.Ниже код работает хорошо для меня.Передайте значение дня недели с 1 по 7 с воскресенья по субботу и тело уведомления с действием, которое вы хотите запустить, и укажите дату, после чего уведомление придет в этот конкретный день.В выходные дни вызывайте эту функцию дважды со значениями 7 и 1 для субботы и воскресенья.

Надеюсь, это поможет вам.

- (void) weekEndNotificationOnWeekday: (int)weekday :(UILocalNotification *)notification : (NSDate*) alramDate
{
    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSDateComponents *componentsForFireDate = [calendar components:(NSYearCalendarUnit | NSWeekCalendarUnit |  NSHourCalendarUnit | NSMinuteCalendarUnit| NSSecondCalendarUnit | NSWeekdayCalendarUnit) fromDate: alramDate];
    [componentsForFireDate setWeekday: weekday] ; //for fixing Sunday
    //    [componentsForFireDate setHour: 20] ; //for fixing 8PM hour
    //    [componentsForFireDate setMinute:0] ;
    //    [componentsForFireDate setSecond:0] ;
    notification.repeatInterval = NSWeekCalendarUnit;
    notification.fireDate=[calendar dateFromComponents:componentsForFireDate];
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...