EKEvent no se agrega de acuerdo con EKRecurrenceRule dada

Estoy intentando agregar un evento en el calendar con la regla de recurrencia RRULE: FREQ = ANUALMENTE; BYMONTH = 6,7; BYDAY = 1TH

Por lo tanto, de acuerdo con esta regla, el evento debe agregarse anualmente, cada uno de los jueves 1 de junio y julio hasta la date de vencimiento, que he establecido en mi proyecto.

En mi proyecto, los events se crean pero no de acuerdo con la regla de recurrencia. Con el siguiente código, los events se agregaron solo cada jueves 1 de junio. ¿Por qué los events no se agregan el 1º jueves de cada julio también?

Aquí está el código del file .m

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self createEvent]; } - (void)createEvent { EKEventStore *eventStore = [[EKEventStore alloc] init]; EKEvent *event = [EKEvent eventWithEventStore:eventStore]; event.title = @"testRecurrenceRule"; event.location = @"Dhaka"; [event setCalendar:[eventStore defaultCalendarForNewEvents]]; event.startDate = [self dateFromString:@"2013-06-18T21:00:00+06:00"]; event.endDate = [self dateFromString:@"2013-06-18T22:00:00+06:00"]; id recurrenceRule = [self recurrenceRuleForEvent]; if(recurrenceRule != nil) [event addRecurrenceRule:recurrenceRule]; if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) { // iOS 6 and later [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { if (granted) { dispatch_async(dispatch_get_main_queue(), ^{ [self saveTheEvent:event eventStore:eventStore]; //[eventStore saveEvent:event span:EKSpanThisEvent error:error]; }); } else { dispatch_async(dispatch_get_main_queue(), ^{ //do nothing }); } }]; } else { [self saveTheEvent:event eventStore:eventStore]; } textView.text = [NSString stringWithFormat:@"Event has been added with recurrence rule %@",recurrenceRule]; } - (void)saveTheEvent:(EKEvent *)aEvent eventStore:(EKEventStore *)aStore { [aStore saveEvent:aEvent span:EKSpanThisEvent error:NULL]; } - (EKRecurrenceRule *)recurrenceRuleForEvent { //just creating a recurrence rule for RRULE:FREQ=YEARLY;BYMONTH=6,7;BYDAY=1TH // setting the values directly for testing purpose. //FREQ=YEARLY EKRecurrenceFrequency recurrenceFrequency = EKRecurrenceFrequencyYearly; NSInteger recurrenceInterval = 1; EKRecurrenceEnd *endRecurrence = nil; NSMutableArray *monthsOfTheYearArray = [NSMutableArray array]; NSMutableArray *daysOfTheWeekArray = [NSMutableArray array]; NSMutableArray *daysOfTheMonthArray = [NSMutableArray array]; NSMutableArray *weeksOfTheYearArray = [NSMutableArray array]; NSMutableArray *daysOfTheYearArray = [NSMutableArray array]; NSMutableArray *setPositionsArray = [NSMutableArray array]; //BYMONTH=6,7 [monthsOfTheYearArray addObject:[NSNumber numberWithInt:6]]; [monthsOfTheYearArray addObject:[NSNumber numberWithInt:7]]; //BYDAY=1TH [daysOfTheWeekArray addObject:[EKRecurrenceDayOfWeek dayOfWeek:5 weekNumber:1]]; endRecurrence = [EKRecurrenceEnd recurrenceEndWithEndDate:[self dateFromString:@"2018-12-15T22:30+06:00"]]; EKRecurrenceRule *recurrence = [[EKRecurrenceRule alloc] initRecurrenceWithFrequency:recurrenceFrequency interval:recurrenceInterval daysOfTheWeek:daysOfTheWeekArray daysOfTheMonth:daysOfTheMonthArray monthsOfTheYear:monthsOfTheYearArray weeksOfTheYear:weeksOfTheYearArray daysOfTheYear:daysOfTheYearArray setPositions:setPositionsArray end:endRecurrence]; return recurrence; } - (NSDate *)dateFromString:(NSString *)string { //check if the date string in null if ([string length] == 0) return nil; NSString *dateString = nil; NSString *modifiedString = nil; BOOL secSpotMissing = false; NSRange range = [string rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"T"]]; if (range.location != NSNotFound) { dateString = [string substringFromIndex:range.location]; range = [dateString rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"+-Z"]]; if (range.location != NSNotFound) { //seperate the time portion of date string and checking second field is missing or not. like is it HH:mm or HH:mm:ss? if ([[[dateString substringToIndex:range.location] componentsSeparatedByString:@":"] count] < 3) secSpotMissing = true; //seperate the time zone portion and checking is there any extra ':' on it. It should like -0600 not -06:00. If it has that extra ':', just replacing it here. dateString = [dateString substringFromIndex:range.location]; if([dateString hasSuffix:@"Z"]) modifiedString = [dateString stringByReplacingOccurrencesOfString:@"Z" withString:@"+0000"]; else modifiedString = [dateString stringByReplacingOccurrencesOfString:@":" withString:@""]; string = [string stringByReplacingOccurrencesOfString:dateString withString:modifiedString]; } } else return nil; // converting the date string according to it's format. NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init]; if (secSpotMissing) [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mmZZZ"]; else [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"]; return [dateFormatter dateFromString:string]; } 

¿Alguien por favor me puede ayudar con esto?

Esto parece ser una repetición de otra pregunta. Básicamente, de acuerdo con la regla "BYDAY", la primera frecuencia anual es la primera semana del año, en lugar de la primera semana cada mes.

@Shuvo, no leí rfc. Pero aquí está el documento de Apple EKRecurrenceDayOfWeek .

La class EKRecurrenceDayOfWeek representa un día de la semana para usar con un object EKRecurrenceRule. Un día de la semana puede tener opcionalmente un número de semana, lo que indica un día específico en la frecuencia de la regla de recurrencia. Por ejemplo, un día de la semana con un valor de día del martes y un número de semana de 2 representaría el segundo martes de cada mes en una regla de recurrencia mensual y el segundo martes de cada año en una regla de recurrencia anual.

Cuando dices "1er jueves", eso es correcto, excepto en el context anual, es el 1 ° jueves del año.

El error fue confirmado por Apple, al less hasta iOS 7.1.3 (que es la última versión disponible en este momento).