iosobjective-ciphoneswifteventkit

EKEvent is not following EKRecurrenceRule


I am adding an event in iOS calendar using EventKit. The event is recurring event. I am setting recurring rules for the event programmatically. Event is getting added in calendar successfully but the dates shown on calendar are not same as I set them.

Event details enter image description here

Recurring rules. enter image description here

After event is successfully added to calendar this is what I get in calendar entry enter image description here

My event is being show for 2017 but I didn't set the end date to 2017 it was 2016.

I tried adding the event with iOs calendar and got the same result.

Below is the code I am using.

/*!
 *  This method, called added event to the calendar
 */
- (void)addEventToCalendar
{
    @try {


        /* Event added to device calendar */
        [SINGLETON.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
            if (granted) {

                [SINGLETON.event_Dateformat setDateFormat:[self dateFormatForSelectedLanguage]];
                EKEvent *event = [EKEvent eventWithEventStore:SINGLETON.eventStore];
                event.title = _event.eventTitle;
                event.startDate = [SINGLETON.event_Dateformat dateFromString:eventInfo.eventActualStartDate];
                event.endDate = [SINGLETON.event_Dateformat dateFromString:eventInfo.eventActualEndDate];
                event.notes = flattenHTML(eventInfo.eventDescription);

                // Get notification 2 hours before the event start time.
                [event addAlarm:[EKAlarm alarmWithRelativeOffset:-(2*60*60)]];
                [event setCalendar:[SINGLETON.eventStore defaultCalendarForNewEvents]];

                /* Here opening Event edit view controller */
                EKEventEditViewController *controller = [[EKEventEditViewController alloc] init];
                controller.event = event;
                controller.eventStore = SINGLETON.eventStore;
                controller.editViewDelegate = self;

                // Event is recurring mark it is repeat in calendar.

                // List of days on which a particular event occurs.
                NSMutableArray <EKRecurrenceDayOfWeek *> *daysOfTheWeek = [[NSMutableArray alloc] init];

                if (_event.eventRecurrence &&
                    ! [_event.eventDays containsString:@"N/A"]) {
                    for (NSString *dayName in [_event.eventDays componentsSeparatedByString:@","]) {
                        EKRecurrenceDayOfWeek *aDay = [EKRecurrenceDayOfWeek dayOfWeek:[self weekDayForDayName:dayName]];
                        [daysOfTheWeek addObject:aDay];
                    }
                }

                // When to stop reminding user for the event.
                EKRecurrenceEnd *endDate = [EKRecurrenceEnd recurrenceEndWithEndDate:event.endDate];

                EKRecurrenceRule *repeatRule = [[EKRecurrenceRule alloc] initRecurrenceWithFrequency:[self recurrenceFrequencey:_event.eventType] interval:1 daysOfTheWeek:daysOfTheWeek daysOfTheMonth:nil monthsOfTheYear:nil weeksOfTheYear:nil daysOfTheYear:nil setPositions:nil end:endDate];

                event.allDay = NO;

                 event.recurrenceRules = @[repeatRule];

                //[event addRecurrenceRule:repeatRule];

                dispatch_async(dispatch_get_main_queue(), ^{

                    //NSError *erroOnSave = nil;
                    // [SINGLETON.eventStore saveEvent:event span:EKSpanFutureEvents commit:YES error:&erroOnSave];
                    [MBProgressHUD hideAllHUDsForView:self.view animated:YES];
                    [self presentViewController:controller animated:YES completion:nil];
                });

            }else{
                dispatch_async(dispatch_get_main_queue(), ^{
                    [MBProgressHUD hideAllHUDsForView:self.view animated:YES];

                [SINGLETON alertViewTitle:@""
                                  message:NSLocalizedString(@"Calendar setting alert", nil)
                              cancelTitle:NSLocalizedString(@"OK", nil)
                                doneTitle:nil
                                      tag:0];
                    });

            }
        }];

    }
    @catch (NSException *exception) {
        DLog(@"%@",exception);
    }
}

Below is the event details I get in debugger:

EKEvent <0x7f94b1f19d00>
{
     EKEvent <0x7f94b1f19d00>
{    title =        TBW   ; 
     location =     ; 
     calendar =     EKCalendar <0x7f94b439d280> {title = Calendar; type = Local; allowsModify = YES; color = #1BADF8;}; 
     alarms =       (
    "EKAlarm <0x7f94b4352fe0> {triggerInterval = -7200.000000}"
); 
     URL =          (null); 
     lastModified = 2016-04-25 05:18:27 +0000; 
     startTimeZone =    Asia/Kolkata (GMT+5:30) offset 19800; 
     startTimeZone =    Asia/Kolkata (GMT+5:30) offset 19800 
}; 
     location =     ; 
     structuredLocation =   (null); 
     startDate =    2015-09-20 18:30:00 +0000; 
     endDate =      2016-05-31 18:30:00 +0000; 
     allDay =       0; 
     floating =     0; 
     recurrence =   EKRecurrenceRule <0x7f94b43e7110> RRULE FREQ=WEEKLY;INTERVAL=1;UNTIL=20160531T183000Z;BYDAY=MO,TH; 
     attendees =    (null); 
     travelTime =   (null); 
     startLocation =    (null);
};

Please suggest what I am using wrong or I am missing something.


Solution

  • I have found a solution of this question with help of this answer

    iOS calendar is behaving strangly

    I was setting the Ends parameter in wrong way. It should be on same date as Starts. Time should be different.

    Now my event screen looks like this

    enter image description here