Search code examples
iosiphonecalendareventkit

Programmatically add custom event in the iPhone Calendar


Is there any way to add iCal event to the iPhone Calendar from the custom App?


Solution

  • Based on Apple Documentation, this has changed a bit as of iOS 6.0.

    1) You should request access to the user's calendar via "requestAccessToEntityType:completion:" and execute the event handling inside of a block.

    2) You need to commit your event now or pass the "commit" param to your save/remove call

    Everything else stays the same...

    Add the EventKit framework and #import <EventKit/EventKit.h> to your code.

    In my example, I have a NSString *savedEventId instance property.

    To add an event:

        EKEventStore *store = [EKEventStore new];
        [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
            if (!granted) { return; }
            EKEvent *event = [EKEvent eventWithEventStore:store];
            event.title = @"Event Title";
            event.startDate = [NSDate date]; //today
            event.endDate = [event.startDate dateByAddingTimeInterval:60*60];  //set 1 hour meeting
            event.calendar = [store defaultCalendarForNewEvents];
            NSError *err = nil;
            [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
            self.savedEventId = event.eventIdentifier;  //save the event id if you want to access this later
        }];
    

    Remove the event:

        EKEventStore* store = [EKEventStore new];
        [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
            if (!granted) { return; }
            EKEvent* eventToRemove = [store eventWithIdentifier:self.savedEventId];
            if (eventToRemove) {
                NSError* error = nil;
                [store removeEvent:eventToRemove span:EKSpanThisEvent commit:YES error:&error];
            }
        }];
    

    This adds events to your default calendar, if you have multiple calendars then you'll have find out which one that is

    Swift version

    You need to import the EventKit framework

    import EventKit
    

    Add event

    let store = EKEventStore()
    store.requestAccessToEntityType(.Event) {(granted, error) in
        if !granted { return }
        var event = EKEvent(eventStore: store)
        event.title = "Event Title"
        event.startDate = NSDate() //today
        event.endDate = event.startDate.dateByAddingTimeInterval(60*60) //1 hour long meeting
        event.calendar = store.defaultCalendarForNewEvents
        do {
            try store.saveEvent(event, span: .ThisEvent, commit: true)
            self.savedEventId = event.eventIdentifier //save event id to access this particular event later
        } catch {
            // Display error to user
        }
    }
    

    Remove event

    let store = EKEventStore()
    store.requestAccessToEntityType(EKEntityTypeEvent) {(granted, error) in
        if !granted { return }
        let eventToRemove = store.eventWithIdentifier(self.savedEventId)
        if eventToRemove != nil {
            do {
                try store.removeEvent(eventToRemove, span: .ThisEvent, commit: true)
            } catch {
                // Display error to user
            }
        }
    }