Using EventKit in iOS
I presented a talk at /dev/world/2011 on using EventKit and EventKitUI in iOS 4. Below is a summary of the talk, the slides and links to the sample code I used.
What's EventKit?
It is a framework provided by Apple in iOS 4+ for integrating your iOS app with the built in calendar app (iCal). You are able to retrieve events from the calendar, as well as create, update and delete events.
The Simulator
Although there is no calendar application in the iOS simulator, you can still use it for EventKit development. For my talk, I created an application that could retrieve events stored in the simulator, and insert sample ones if the calendar was empty. The code for this sample application is available on github.
Fetching Events
Retrieving stored events from a users calendar is super simple. The only parameters you need to specify is a date range and the calendar you want to query.
EKEventStore *eventStore = [[EKEventStore alloc] init];
NSDate *startDate = [NSDate date];
NSDate *endDate = [NSDate distantFuture];
NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:startDate
endDate:endDate
calendars:nil];
NSArray *events = [eventStore eventsMatchingPredicate:predicate];
Calendars within the Calendar app
The calendar app is made up of many calendars, e.g. Home calendar, Work calendar, Birthday calendar etc. Every event created must belong to a calendar, however some calendars are read-only.
You can retrieve the following calendar information in iOS 4:
EKEventStore *eventStore = [[EKEventStore alloc] init];
// Get all calendars
NSArray * calendars = [eventStore calendars];
// Get the default calendar
EKCalendar * calendar = [eventStore defaultCalendarForNewEvents];
// Test if calendar is read-‐only
[calendar allowsContentModifications];
// Get the associated colour of a calendar
[UIColor colorWithCGColor:calendar.CGColor];
Inserting Events
As the following code illustrates, inserting an event to a users calendar is also fairly simple.
EKEventStore *eventStore = [[EKEventStore alloc] init];
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
event.calendar = [eventStore defaultCalendarForNewEvents];
event.title = @"/dev/world/2011";
event.location = @"Melbourne";
event.notes = @"AUC Developer Conference";
event.startDate = startDate;
event.endDate = endDate;
event.allDay = YES;
[eventStore saveEvent:event span:EKSpanThisEvent error:nil];
Inserting Events with EventKitUI
Instead of saving the created event directly into the event store, a better approach is to use EventKitUI which will allow the user visually check/modify an event before it is inserted.
EKEventStore * eventStore = [[EKEventStore alloc] init];
EKEvent * event = [EKEvent eventWithEventStore:eventStore];
event.title = title;
event.location = location;
event.startDate = startDate;
event.endDate = endDate;
event.notes = notes;
EKEventEditViewController *controller = [[EKEventEditViewController alloc] init];
controller.eventStore = eventStore;
controller.event = event;
controller.editViewDelegate = self;
[self presentModalViewController:controller animated:YES];
[controller release];
[eventStore release];
If you use EventKitUI, remember to always set the editViewDelegate delegate, and implement a delegate method to handle the dismissal of the view controller window.
-(void)eventEditViewController:(EKEventEditViewController *)controller
didCompleteWithAction:(EKEventEditViewAction)action {
switch (action) {
case EKEventEditViewActionCanceled:
// User tapped "cancel"
break;
case EKEventEditViewActionSaved:
// User tapped "save"
break;
case EKEventEditViewActionDeleted:
// User tapped "delete"
break;
default:
break;
}
[self dismissModalViewControllerAnimated:YES];
}