UILocalNotification repeatInterval sur 20 jours

J'aimerais créer une notification locale avec répétition de l'intervalle personnalisé (tous les 20 jours par exemple). Je sais que nous avons NSDayCalendarUnit, kCFCalendarUnitMonth … mais j'espère régler l'intervalle de répétition à 20 jours. Je ne veux pas créer de notification pour tous les jours.

Mon vrai besoin est de répéter une notification pendant 21 jours consécutifs, puis ne pas la lancer pendant 7 jours plus tard, puis une nouvelle 21 jours avec notification et 7 jours sans … etc. Je devrais programmer tous ces jours même si l'application est inactif.

Pour ce faire je décide de créer un 21 notifications depuis une date d'incendie avec repeatInterval = 28days (voici le problème)

Essayez ceci, vous pouvez changer l'intervalle en sélectionnant setDay , setMonth , ….:

 NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *components = [[NSDateComponents alloc] init]; [components setDay:3]; NSDate *date3Days = [calendar dateByAddingComponents:components toDate:[NSDate date] options:0]; UIApplication* app = [UIApplication sharedApplication]; NSArray* oldNotifications = [app scheduledLocalNotifications]; if ( oldNotifications ) { [app cancelAllLocalNotifications]; app.applicationIconBadgeNumber = 0; } UILocalNotification* notifyAlarm = [[UILocalNotification alloc] init]; if (notifyAlarm) { notifyAlarm.fireDate = date3Days; notifyAlarm.timeZone = [NSTimeZone defaultTimeZone]; notifyAlarm.alertBody = NSLocalizedSsortingng( @"Push message", @""); notifyAlarm.soundName = @"sound.wav"; [app scheduleLocalNotification:notifyAlarm]; } 

Si vous voulez définir une heure spécifique après laquelle UILocalNotifications devrait apparaître, vous pouvez créer une méthode de la solution ci-dessus et faire une boucle sur un tableau qui indique les jours où vous souhaitez afficher une notification:

 NSArray *arrayNumbers = @[@5, @7, @14, @21, @30, @60, @90, @120]; NSDictionary *dictNotifications = [[NSUserDefaults standardUserDefaults] objectForKey:kUserDefAppStarts]; for ( NSNumber *bla in arrayNumbers ){ NSSsortingng *strKey = [NSSsortingng ssortingngWithFormat:@"%@%@", kUserDefAppStarts, bla]; NSDictionary *dict = dictNotifications[strKey]; NSSsortingng *strMessageQuestion = dict[kKeyMessage]; [self createNotificationWithNumberOfDays:[bla integerValue] andMessage:strMessageQuestion userInfo:dict]; } 

Et voici la méthode que vous devez appeler

 + (void)createNotificationWithNumberOfDays:(int)days andMessage:(NSSsortingng *)message userInfo:(NSDictionary *)dict{ NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *components = [[NSDateComponents alloc] init]; [components setDay:days]; NSDate *dateAlert = [gregorian dateByAddingComponents:components toDate:[NSDate date] options:0]; UIApplication *app = [UIApplication sharedApplication]; UILocalNotification *notifyAlarm = [[UILocalNotification alloc] init]; if( notifyAlarm ){ [notifyAlarm setFireDate:dateAlert]; [notifyAlarm setTimeZone:[NSTimeZone defaultTimeZone]]; [notifyAlarm setSoundName:@"soundname"]; [notifyAlarm setAlertBody:message]; [notifyAlarm setUserInfo:dict]; [app scheduleLocalNotification:notifyAlarm]; } 

}

Si vous souhaitez planifier une UILocalNotification pendant 20 jours à partir de l'heure actuelle, procédez comme suit:

 NSCalendar *currentCalendar = [NSCalendar currentCalendar]; NSDateComponents *dateComp = [[NSDateComponents alloc] init]; int desiredAmountOfMonths = 4; for (int month = 0; month < desiredAmountOfMonths; month++) { dateComp.month = month; dateComp.day = 20; NSDate *fireDate = [currentCalendar dateByAddingComponents:dateComp toDate:[NSDate date] options:NSCalendarMatchNextTimePreservingSmallerUnits]; UILocalNotification *notification = [[UILocalNotification alloc] init]; notification.fireDate = fireDate; notification.timeZone = [NSTimeZone defaultTimeZone]; } 

Vous devrez modifier le UILocalNotification pour quel message, quel son, etc., puis triggersr la notification une fois la personnalisation terminée.