UILocalNotification est censé répéter tous les jours de la semaine, mais triggers également les week-ends

J'ai une UILocalNotification qui est censée se triggersr une fois par jour, du lundi au vendredi, mais pas le week-end. Je pensais que définir la propriété repeatInterval de la notification à NSWeekdayCalendarUnit accomplirait ceci. Malheureusement pour moi, mes notifications sont toujours en cours le week-end. Quelqu'un peut-il suggérer pourquoi? Voici mon code:

UILocalNotification *localNotification = [[UILocalNotification alloc] init]; localNotification.alertAction = @"View"; localNotification.alertBody = NSLocalizedSsortingng(@"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 dateFromSsortingng:@"01-04-2012 11:00"]; localNotification.fireDate = fireDate; localNotification.repeatInterval = NSWeekdayCalendarUnit; [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; break; [localNotification release]; 

Weekday dans iOS signifie juste un jour à l'intérieur d'une semaine. Il n'a pas la connotation «semaine de travail» par opposition à un week-end.

La documentation le dit un peu plus clairement, en suggérant que vous utilisiez 1-7 comme unités:

NSWeekdayCalendarUnit

Spécifie l'unité de la semaine.

La valeur correspondante est un kCFCalendarUnitSecond. Égal à kCFCalendarUnitWeekday. Les unités de la semaine sont les nombres de 1 à N (où pour le calendar grégorien N = 7 et 1 est dimanche).

Source: http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/Reference/NSCalendar.html

Pour configurer correctement vos notifications du lundi au vendredi, voici un code squelette. Vous devrez l'exécuter 5 fois, il serait donc bon de l'encapsuler à l'intérieur d'une méthode que les parameters de la fireDate. J'ai montré comment vous pourriez le faire pour lundi.

 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; 

Vous devez définir le jour séparément pour la notification locale et définir la notification locale repeatInterval sur l'unité NSWeekCalendar. COMME

  [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]; 

Ici, j'ai fait les methods setDateForAlarmWithWeekday qui returnne la date à définir dans la propriété fireDate de Notification locale et notificationWithItem qui définit Notification locale.

 -(void) notificationWithItem:(NSDictionary*)tmpdict Date:(NSDate *)date andRepeatInterval:(NSCalendarUnit)CalUnit { UILocalNotification *localNotification =[[UILocalNotification alloc]init]; if (localNotification==nil) { return; } localNotification.fireDate=date; localNotification.timeZone=[NSTimeZone defaultTimeZone]; localNotification.repeatCalendar=[NSCalendar currentCalendar]; localNotification.alertBody=[NSSsortingng ssortingngWithFormat:@"%@",[tmpdict objectForKey:@"Reminder"]]; NSDictionary *snoozeDic=[tmpdict objectForKey:@"Snooze"]; if ([[snoozeDic valueForKey:@"Switch"]intValue]==1) { localNotification.alertAction=@"Snooze"; }else { localNotification.hasAction=NO; } localNotification.repeatInterval=CalUnit; localNotification.soundName=[NSSsortingng ssortingngWithFormat:@"%@.caf",[tmpdict objectForKey:@"Tone"]]; localNotification.userInfo=[NSDictionary dictionaryWithObject:tmpdict forKey:@"AlarmInfo"]; localNotification.applicationIconBadgeNumber=1; [[UIApplication sharedApplication]scheduleLocalNotification:localNotification]; } -(NSDate*)SetDateForAlarmWithWeekday:(int)WeekDay:(NSDictionary*)dics { NSLog(@"set date for alarm called"); NSCalendar *calendar=[NSCalendar currentCalendar]; [calendar setTimeZone:[NSTimeZone defaultTimeZone]]; unsigned currentFlag=NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit|NSWeekdayCalendarUnit; NSDateComponents *comp=[calendar components:currentFlag fromDate:[NSDate date]]; NSArray *array=[[dics objectForKey:@"Time"] componentsSeparatedBySsortingng:@" "]; NSInteger hour=[[[[array objectAtIndex:0] componentsSeparatedBySsortingng:@":"] objectAtIndex:0] intValue]; NSInteger min=[[[[array objectAtIndex:0] componentsSeparatedBySsortingng:@":"] objectAtIndex:1] intValue]; if ([[array objectAtIndex:1] isEqualToSsortingng:@"PM"]) { hour=hour+12; } else { if (hour==12) { hour=0; } } comp.hour=hour; comp.minute=min; comp.second=0; NSLog(@"set date for alarm (%i:%i:%i)",comp.hour,comp.minute,comp.second); NSLog(@"weekday :%i ",WeekDay); NSLog(@"comp weekday %i",comp.weekday); int diff=(WeekDay-comp.weekday); NSLog(@"difference :%i",diff); int multiplier; if (WeekDay==0) { multiplier=0; }else { multiplier=diff>0?diff:(diff==0?diff:diff+7); } NSLog(@"multiplier :%i",multiplier); return [[calendar dateFromComponents:comp]dateByAddingTimeInterval:multiplier*secondsInOneDay]; } 

J'espère que cela vous aidera.

J'ai aussi cherché à ce sujet. Le code ci-dessous fonctionne bien pour moi. Passer la valeur du jour de la semaine 1 à 7 du dimanche au samedi et le corps de notification avec l'action que vous voulez tirer et spécifiez votre date, puis la notification viendra sur ce jour spécifique. Pour les week-ends, appelez cette fonction deux fois avec la valeur 7 et 1 pour samedi et dimanche.

J'espère que cela vous aidera.

 - (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]; } 

Similaire mais à Swift.

Rappelez-vous que WeekDay commence à 1 = dimanche et passe à 7. Voir 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?.ssortingngFromDate(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) }