How to load events from user's calendar

In this post let's go over how to load events that user has in their system calendar. Learn about permissions, requesting access and load the events.

Published: June 7, 2020
See books

I want to make this example as short as possible so we will cover only the truly necessary stuff.

To load events (represented with the EKEvent class) you first need a calendar. And to get calendar and read from it, you need permission from user.

Preparation

There is special class EKEventStore used to request access, getting events, saving them etc. So the first step is to import the framework and create its instance like so:

import EventKit

let eventStore = EKEventStore()

With this ready we can request permissions from the user.

Info.plist keys

You need to add two keys to Info.plist that explain why do you want the access. NSCalendarsUsageDescription and NSContactsUsageDescription. The second is needed because you may have shared calendars.

Theoretically in this case we could add just the first but I think it is better to be safe and prevent any unnecessary problems.

Requesting access

Once you added these keys, we can move to requesting access to the calendar:

func requestAccess() {
    eventStore.requestAccess(to: .event) { (granted, error) in
        if granted {
            DispatchQueue.main.async {
                // load events
            }
        }
    }
}

If we get access, we can proceed to load events. Otherwise you should show the user some kind of explainer that this feature won't work without access and redirect them to Settings to allow calendar access.

Preparing predicate for events

To load an event we are going once again to use the EKEventStore instance we already have. We need a special kind of predicate to load the events. We can use event store to create one like this:

let weekFromNow = Date().advanced(by: TimeInterval.week)
let predicate = eventStore.predicateForEvents(withStart: Date(), end: weekFromNow, calendars: nil)

This will create predicate to match events in the upcoming week (or rather upcoming 7day period). TimeInterval.week is just my extension to simplify things a bit.

If you pass nil for the calendars parameter it will search all the available calendars.

Note: The maximum time span for getting events if four years for performance reasons. I think that is more than enough.

Loading events

Once you have a predicate you can get events for it:

let events = eventStore.events(matching: predicate)

And that is the absolute barebone example of loading calendar events in iOS 🙂

The events result above is an array of EKEvent each instance represents event in user's calendar. It has title property, startDate, endDate and many more you can use to display the event in your UI.

Comprehensive example

If you are looking for more EKEventKit examples you can check out my open-source example project showcasing among others how to let user select calendars, how to edit event, add new one.. It is available on GitHub.

Uses: Xcode 12 & Swift 5.3

Bluesky logo

Follow on Bluesky to not miss new posts

Filip Němeček profile photo

WRITTEN BY

Filip Němeček Mastodon

iOS blogger and developer with interest in Python/Django.

iOS blogger and developer with interest in Python/Django.