
Eventkit
- 215 installs
- 297 repo stars
- Updated August 4, 2026
- vabole/apple-skills
Read and write calendars and reminders with EventKit, including permission flows, EKEventStore queries, recurrence rules, and conflict-safe sync with the system Calendar database.
About
Documents EventKit usage for iOS and macOS apps: permissions, EKEventStore queries, creating and editing events and reminders, recurrence, alarms, and change notifications aligned with Apple calendar privacy expectations.
- Calendar and reminder permission UX
- EKEventStore fetch and save patterns
- Recurrence, alarms, and attendee fields
- Background refresh and change notifications
- Privacy-safe minimal data access
Eventkit by the numbers
- 215 all-time installs (skills.sh)
- +4 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #423 of 1,039 Mobile Development skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/vabole/apple-skills --skill eventkitAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 215 |
|---|---|
| repo stars | ★ 297 |
| Last updated | August 4, 2026 |
| Repository | vabole/apple-skills ↗ |
What it does
Read and write calendars and reminders with EventKit, including permission flows, EKEventStore queries, recurrence rules, and conflict-safe sync with the system Calendar database.
Files
EventKit Documentation
Search these docs to answer questions about calendar and reminder APIs.
Return Format
Always include: 1. Summary - Answer the question concisely 2. File paths - List relevant files for full details
Files
eventkit-index.md- Framework overview, events, remindersekeventstore.md- Event store access and permissionsekreminder.md- Creating and managing reminders
Navigation: EventKit
Class
EKEventStore
Available on: iOS 4.0+, iPadOS 4.0+, Mac Catalyst 13.1+, macOS 10.8+, visionOS 1.0+, watchOS 2.0+
An object that accesses a person’s calendar events and reminders and supports the scheduling of new events.
class EKEventStoreOverview
The EKEventStore class is an app’s point of contact for accessing calendar and reminder data.
After initializing the event store, you must request access to events or reminders before attempting to fetch or create data. To request access to reminders, call requestFullAccessToReminders(completion:)). To request access to events, call requestWriteOnlyAccessToEvents(completion:)) or requestFullAccessToEvents(completion:)).
Important: To request access to events and reminders, your app needs to include permission strings in its Info.plist file that explain to someone why the app needs access. For more information, see Accessing the event store.A typical workflow for using an event store is:
1. Create a predicate, or a search query for events, with predicateForEvents(withStart:end:calendars:)). 2. Fetch and process events that match the predicate with the events(matching:)) and enumerateEvents(matching:using:)) methods. 3. Save and delete events from the event store with the save(_:span:commit:)) and remove(_:span:commit:)) methods.
Use similar methods to access and manipulate reminders.
After receiving an object from an event store, don’t use that object with a different event store. This restriction applies to EKObject subclasses such as EKEvent, EKReminder, EKCalendar, and EKSource, as well as predicates that the event store creates. For example, don’t fetch an event from one event store, modify the event, and then pass it to save(_:span:)) in a different store.
Inherits From
Conforms To
Creating event stores
- init()) Creates a new event store.
- init(sources:)) Creates an event store that contains data for the specified sources.
- eventStoreIdentifier The unique identifier for the event store.
Requesting access to events and reminders
- requestWriteOnlyAccessToEvents(completion:)) Prompts the person using your app to grant or deny write access to event data.
- requestFullAccessToEvents(completion:)) Prompts people to grant or deny read and write access to event data.
- requestFullAccessToReminders(completion:)) Prompts people to grant or deny read and write access to reminders.
- authorizationStatus(for:)) Determines the authorization status for the given entity type.
- EKAuthorizationStatus The current authorization status for a specific entity type.
- EKEventStoreRequestAccessCompletionHandler The signature for a closure that EventKit calls when requesting access to event and reminder data.
- NSCalendarsFullAccessUsageDescription A message that tells people why the app is requesting access to read and write their calendar data.
- NSCalendarsWriteOnlyAccessUsageDescription A message that tells people why the app is requesting access to create calendar events.
- NSRemindersFullAccessUsageDescription A message that tells people why the app is requesting access to read and write their reminders data.
Accessing account sources
- sources An unordered array of objects that represent accounts that contain calendars.
- delegateSources The event sources delegated to the person using your app.
- source(withIdentifier:)) Locates an event source with the specified identifier.
Saving and restoring state
- commit()) Commits all unsaved changes to the event store.
- reset()) Reverts the event store to its saved state.
- refreshSourcesIfNecessary()) Pulls new data from remote sources, if necessary.
Accessing calendars
- defaultCalendarForNewEvents The calendar that events are added to by default, as specified by user settings.
- defaultCalendarForNewReminders()) Identifies the default calendar for adding reminders to, as specified by user settings.
- calendars(for:)) Identifies the calendars that support a given entity type, such as reminders or events.
- calendar(withIdentifier:)) Locates a calendar with the specified identifier.
- saveCalendar(_:commit:)) Saves a calendar to the event store by either committing or batching the changes.
- removeCalendar(_:commit:)) Removes a calendar from the event store by either committing or batching the changes.
- calendars The calendars associated with the event store.
Accessing calendar events
- event(withIdentifier:)) Locates the first occurrence of an event with a given identifier.
- calendarItem(withIdentifier:)) Locates a reminder or the first occurrence of an event with the specified identifier.
- calendarItems(withExternalIdentifier:)) Locates all reminders or the first occurrences of all events with the specified external identifier.
- remove(_:span:)) Removes an event from the event store.
- remove(_:span:commit:)) Removes an event or recurring events from the event store by either committing or batching the changes.
- remove(_:commit:)) Removes a reminder from the event store by either committing or batching the changes.
- save(_:span:)) Saves changes to an event permanently.
- save(_:span:commit:)) Saves an event or recurring events to the event store by either committing or batching the changes.
- save(_:commit:)) Saves changes to a reminder by either committing or batching the changes.
Searching calendars
- enumerateEvents(matching:using:)) Finds all events that match a given predicate and calls a given callback for each event found.
- events(matching:)) Finds all events that match a given predicate.
- fetchReminders(matching:completion:)) Fetches reminders that match a given predicate.
- cancelFetchRequest(_:)) Cancels the request to fetch reminders.
- predicateForEvents(withStart:end:calendars:)) Creates a predicate to identify events that occur within a given date range.
- predicateForReminders(in:)) Creates a predicate to identify all reminders in a collection of calendars.
- predicateForCompletedReminders(withCompletionDateStarting:ending:calendars:)) Creates a predicate to identify all completed reminders that occur within a given date range.
- predicateForIncompleteReminders(withDueDateStarting:ending:calendars:)) Creates a predicate to identify all incomplete reminders that occur within a given date range.
- EKEventSearchCallback The signature for a closure that operates on events when enumerating them.
Deprecated methods
- requestAccess(to:completion:)) Prompts the person using your app to grant or deny access to event or reminder data.
Structures
- EKEventStore.EventStoreChanged A notification posted when changes are made to the Calendar or Reminders database.
Essentials
- Accessing the event store Request access to a person’s calendar data through the event store.
- Accessing Calendar using EventKit and EventKitUI Choose and implement the appropriate Calendar access level in your app.
---
Extracted from Apple DocC JSON by apple-skills tooling. This is unofficial content. All documentation belongs to Apple Inc.
Navigation: EventKit
Class
EKReminder
Available on: iOS 6.0+, iPadOS 6.0+, Mac Catalyst 13.1+, macOS 10.8+, visionOS 1.0+, watchOS 2.0+
A class that represents a reminder in a calendar.
class EKReminderOverview
Use the init(eventStore:)) method to create a new reminder. Use the properties in the class to get and modify certain information about a reminder.
Inherits From
Conforms To
Creating a Reminder
- init(eventStore:)) Creates and returns a new reminder in the given event store.
Accessing Reminder Properties
- EKReminderPriority The priority of the reminder.
- priority The reminder’s priority.
- startDateComponents The start date of the task.
- dueDateComponents The date by which the reminder should be completed.
- isCompleted A Boolean value determining whether or not the reminder is marked completed.
- completionDate The date on which the reminder was completed.
Events and reminders
- Creating events and reminders Create and modify events and reminders in a person’s database.
- Retrieving events and reminders Fetch events and reminders from the Calendar database.
- Updating with notifications Register for notifications about changes and keep your app up to date.
- Managing location-based reminders Access reminders set up with geofence-enabled alarms on a person’s calendars.
- EKEvent A class that represents an event in a calendar.
---
Extracted from Apple DocC JSON by apple-skills tooling. This is unofficial content. All documentation belongs to Apple Inc.
Navigation: EventKit
Essentials
Creating event stores
- init())
- [init(sources: [EKSource])](/documentation/eventkit/ekeventstore/init(sources:))
- var eventStoreIdentifier: String
Requesting access to events and reminders
- func requestWriteOnlyAccessToEvents(completion: (Bool, (any Error)?) -> Void))
- func requestFullAccessToEvents(completion: (Bool, (any Error)?) -> Void))
- func requestFullAccessToReminders(completion: (Bool, (any Error)?) -> Void))
- class func authorizationStatus(for: EKEntityType) -> EKAuthorizationStatus)
- EKAuthorizationStatus
Status
Deprecated values
Initializers
- EKEventStoreRequestAccessCompletionHandler
- NSCalendarsFullAccessUsageDescription
- NSCalendarsWriteOnlyAccessUsageDescription
- NSRemindersFullAccessUsageDescription
Accessing account sources
- [var sources: [EKSource]](/documentation/eventkit/ekeventstore/sources)
- [var delegateSources: [EKSource]](/documentation/eventkit/ekeventstore/delegatesources)
- func source(withIdentifier: String) -> EKSource?)
Saving and restoring state
Accessing calendars
- var defaultCalendarForNewEvents: EKCalendar?
- func defaultCalendarForNewReminders() -> EKCalendar?)
- [func calendars(for: EKEntityType) -> [EKCalendar]](/documentation/eventkit/ekeventstore/calendars(for:))
- func calendar(withIdentifier: String) -> EKCalendar?)
- func saveCalendar(EKCalendar, commit: Bool) throws)
- func removeCalendar(EKCalendar, commit: Bool) throws)
- [var calendars: [EKCalendar]](/documentation/eventkit/ekeventstore/calendars)
Accessing calendar events
- func event(withIdentifier: String) -> EKEvent?)
- func calendarItem(withIdentifier: String) -> EKCalendarItem?)
- [func calendarItems(withExternalIdentifier: String) -> [EKCalendarItem]](/documentation/eventkit/ekeventstore/calendaritems(withexternalidentifier:))
- func remove(EKEvent, span: EKSpan) throws)
- func remove(EKEvent, span: EKSpan, commit: Bool) throws)
- func remove(EKReminder, commit: Bool) throws)
- func save(EKEvent, span: EKSpan) throws)
- func save(EKEvent, span: EKSpan, commit: Bool) throws)
- func save(EKReminder, commit: Bool) throws)
Searching calendars
- func enumerateEvents(matching: NSPredicate, using: EKEventSearchCallback))
- [func events(matching: NSPredicate) -> [EKEvent]](/documentation/eventkit/ekeventstore/events(matching:))
- [func fetchReminders(matching: NSPredicate, completion: ([EKReminder]?) -> Void) -> Any](/documentation/eventkit/ekeventstore/fetchreminders(matching:completion:))
- func cancelFetchRequest(Any))
- [func predicateForEvents(withStart: Date, end: Date, calendars: [EKCalendar]?) -> NSPredicate](/documentation/eventkit/ekeventstore/predicateforevents(withstart:end:calendars:))
- [func predicateForReminders(in: [EKCalendar]?) -> NSPredicate](/documentation/eventkit/ekeventstore/predicateforreminders(in:))
- [func predicateForCompletedReminders(withCompletionDateStarting: Date?, ending: Date?, calendars: [EKCalendar]?) -> NSPredicate](/documentation/eventkit/ekeventstore/predicateforcompletedreminders(withcompletiondatestarting:ending:calendars:))
- [func predicateForIncompleteReminders(withDueDateStarting: Date?, ending: Date?, calendars: [EKCalendar]?) -> NSPredicate](/documentation/eventkit/ekeventstore/predicateforincompletereminders(withduedatestarting:ending:calendars:))
- EKEventSearchCallback
Deprecated methods
Structures
Initializers
Events and reminders
- Creating events and reminders
- Retrieving events and reminders
- Updating with notifications
- Managing location-based reminders
- EKEvent
Creating Events
Scheduling Events
Constants
Initializers
Constants
Initializers
Comparing Events
Accessing Event Properties
- var eventIdentifier: String!
- var availability: EKEventAvailability
- var startDate: Date!
- var endDate: Date!
- var isAllDay: Bool
- var occurrenceDate: Date!
- var isDetached: Bool
- var organizer: EKParticipant?
- var status: EKEventStatus
- var birthdayContactIdentifier: String?
- var structuredLocation: EKStructuredLocation?
- var birthdayPersonID: Int
- var birthdayPersonUniqueID: String?
Refreshing Event Data
Creating a Reminder
Accessing Reminder Properties
Constants
Initializers
- var priority: Int
- var startDateComponents: DateComponents?
- var dueDateComponents: DateComponents?
- var isCompleted: Bool
- var completionDate: Date?
Calendars
Creating Calendars
Accessing Calendar Properties
Constants
Initializers
Initializers
Type Properties
- static var busy: EKCalendarEventAvailabilityMask
- static var free: EKCalendarEventAvailabilityMask
- static var tentative: EKCalendarEventAvailabilityMask
- static var unavailable: EKCalendarEventAvailabilityMask
- var allowsContentModifications: Bool
- var cgColor: CGColor!
- var color: NSColor!
- var isImmutable: Bool
- var title: String
- var type: EKCalendarType
- var allowedEntityTypes: EKEntityMask
- var source: EKSource!
- var isSubscribed: Bool
- var supportedEventAvailabilities: EKCalendarEventAvailabilityMask
- var calendarIdentifier: String
- func DATETIME_COMPONENTS_DO_NOT_USE())
- func DATE_COMPONENTS_DO_NOT_USE())
Initializers
Defining Participants
Constants
Initializers
Constants
Initializers
Constants
- case unknown
- case pending
- case accepted
- case declined
- case tentative
- case delegated
- case completed
- case inProcess
Initializers
Constants
- case none
- case pending
- case sent
- case delivered
- case recipientNotRecognized
- case noPrivileges
- case deliveryFailed
- case cannotDeliver
- case recipientNotAllowed
Initializers
Accessing Participant Properties
- var isCurrentUser: Bool
- var name: String?
- var participantRole: EKParticipantRole
- var participantStatus: EKParticipantStatus
- var participantType: EKParticipantType
- var url: URL
- var contactPredicate: NSPredicate
Finding Participant Address Book Records
- func abRecord(with: ABAddressBook) -> ABRecord?)
- func abPerson(in: ABAddressBook) -> ABPerson?)
- ABAddressBook
- ABRecord
Recurrence
Creating a Day of the Week
Constants
Deprecated
- static var EKSunday: EKWeekday
- static var EKMonday: EKWeekday
- static var EKTuesday: EKWeekday
- static var EKWednesday: EKWeekday
- static var EKThursday: EKWeekday
- static var EKFriday: EKWeekday
- static var EKSaturday: EKWeekday
Initializers
- convenience init(EKWeekday))
- convenience init(EKWeekday, weekNumber: Int))
- init(dayOfTheWeek: EKWeekday, weekNumber: Int))
Accessing Properties of a Day of the Week
Initializers
Creating a Recurrence End
Accessing Recurrence End Properties
Initializers
Creating a Basic Recurrence Rule
Constants
Initializers
Creating a Complex Recurrence Rule
- [init(recurrenceWith: EKRecurrenceFrequency, interval: Int, daysOfTheWeek: [EKRecurrenceDayOfWeek]?, daysOfTheMonth: [NSNumber]?, monthsOfTheYear: [NSNumber]?, weeksOfTheYear: [NSNumber]?, daysOfTheYear: [NSNumber]?, setPositions: [NSNumber]?, end: EKRecurrenceEnd?)](/documentation/eventkit/ekrecurrencerule/init(recurrencewith:interval:daysoftheweek:daysofthemonth:monthsoftheyear:weeksoftheyear:daysoftheyear:setpositions:end:))
Accessing Recurrence Rule Properties
Constants
Initializers
- var calendarIdentifier: String
- var recurrenceEnd: EKRecurrenceEnd?
- var frequency: EKRecurrenceFrequency
- var interval: Int
- var firstDayOfTheWeek: Int
- [var daysOfTheWeek: [EKRecurrenceDayOfWeek]?](/documentation/eventkit/ekrecurrencerule/daysoftheweek)
- [var daysOfTheMonth: [NSNumber]?](/documentation/eventkit/ekrecurrencerule/daysofthemonth)
- [var daysOfTheYear: [NSNumber]?](/documentation/eventkit/ekrecurrencerule/daysoftheyear)
- [var weeksOfTheYear: [NSNumber]?](/documentation/eventkit/ekrecurrencerule/weeksoftheyear)
- [var monthsOfTheYear: [NSNumber]?](/documentation/eventkit/ekrecurrencerule/monthsoftheyear)
- [var setPositions: [NSNumber]?](/documentation/eventkit/ekrecurrencerule/setpositions)
- func EK_LOSE_FRACTIONAL_SECONDS_DO_NOT_USE())
Initializers
- [init(recurrenceWithFrequency: EKRecurrenceFrequency, interval: Int, daysOfTheWeek: [EKRecurrenceDayOfWeek]?, daysOfTheMonth: [NSNumber]?, monthsOfTheYear: [NSNumber]?, weeksOfTheYear: [NSNumber]?, daysOfTheYear: [NSNumber]?, setPositions: [NSNumber]?, end: EKRecurrenceEnd?)](/documentation/eventkit/ekrecurrencerule/init(recurrencewithfrequency:interval:daysoftheweek:daysofthemonth:monthsoftheyear:weeksoftheyear:daysoftheyear:setpositions:end:))
- init(recurrenceWithFrequency: EKRecurrenceFrequency, interval: Int, end: EKRecurrenceEnd?))
Alarms
Creating an Alarm
Accessing Alarm Dates
Setting GeoFence-based Alarms
Constants
Initializers
Triggering Alarm Actions
Constants
Initializers
Creating Structured Locations
Accessing Structured Location Properties
Common objects
Accessing Calendar Items
Accessing Calendar Item Properties
- var calendar: EKCalendar!
- var title: String!
- var location: String?
- var creationDate: Date?
- var lastModifiedDate: Date?
- var timeZone: TimeZone?
- var url: URL?
Attaching Notes
Displaying Attendees
- var hasAttendees: Bool
- [var attendees: [EKParticipant]?](/documentation/eventkit/ekcalendaritem/attendees)
Adding and Removing Alarms
- var hasAlarms: Bool
- func addAlarm(EKAlarm))
- func removeAlarm(EKAlarm))
- [var alarms: [EKAlarm]?](/documentation/eventkit/ekcalendaritem/alarms)
Setting Recurrence Rules
- var hasRecurrenceRules: Bool
- func addRecurrenceRule(EKRecurrenceRule))
- func removeRecurrenceRule(EKRecurrenceRule))
- [var recurrenceRules: [EKRecurrenceRule]?](/documentation/eventkit/ekcalendaritem/recurrencerules)
Saving and Restoring State
Accessing Source Properties
EventKit Source Types
Initializers
Accessing Calendars
Entity Type
Specifying Multiple Entities
Initializers
Constants
Constants
Initializers
Instance Properties
Virtual conferences
Providing Rooms
- [func fetchAvailableRoomTypes(completionHandler: ([EKVirtualConferenceRoomTypeDescriptor]?, (any Error)?) -> Void)](/documentation/eventkit/ekvirtualconferenceprovider/fetchavailableroomtypes(completionhandler:))
Providing Virtual Conferences
Creating Conference Descriptors
- [init(title: String?, urlDescriptors: [EKVirtualConferenceURLDescriptor], conferenceDetails: String?)](/documentation/eventkit/ekvirtualconferencedescriptor/init(title:urldescriptors:conferencedetails:)-4yf7)
Configuring Virtual Conferences
- var title: String?
- [var urlDescriptors: [EKVirtualConferenceURLDescriptor]](/documentation/eventkit/ekvirtualconferencedescriptor/urldescriptors)
- EKVirtualConferenceURLDescriptor
Creating URL Descriptors
Configuring URL Descriptors
Initializers
Initializers
- [init(title: String?, URLDescriptors: [EKVirtualConferenceURLDescriptor], conferenceDetails: String?)](/documentation/eventkit/ekvirtualconferencedescriptor/init(title:urldescriptors:conferencedetails:)-1a9zt)
Creating Room Type Descriptors
Configuring Room Type Descriptors
- var title: String
- var identifier: EKVirtualConferenceRoomTypeIdentifier
- EKVirtualConferenceRoomTypeIdentifier
Errors
Error Codes
- static var eventNotMutable: EKError.Code
- static var noCalendar: EKError.Code
- static var noEndDate: EKError.Code
- static var noStartDate: EKError.Code
- static var datesInverted: EKError.Code
- static var internalFailure: EKError.Code
- static var calendarReadOnly: EKError.Code
- static var durationGreaterThanRecurrence: EKError.Code
- static var alarmGreaterThanRecurrence: EKError.Code
- static var startDateTooFarInFuture: EKError.Code
- static var startDateCollidesWithOtherOccurrence: EKError.Code
- static var objectBelongsToDifferentStore: EKError.Code
- static var invitesCannotBeMoved: EKError.Code
- static var invalidSpan: EKError.Code
- static var calendarHasNoSource: EKError.Code
- static var calendarSourceCannotBeModified: EKError.Code
- static var calendarIsImmutable: EKError.Code
- static var sourceDoesNotAllowCalendarAddDelete: EKError.Code
- static var recurringReminderRequiresDueDate: EKError.Code
- static var structuredLocationsNotSupported: EKError.Code
- static var reminderLocationsNotSupported: EKError.Code
- static var alarmProximityNotSupported: EKError.Code
- static var calendarDoesNotAllowEvents: EKError.Code
- static var calendarDoesNotAllowReminders: EKError.Code
- static var sourceDoesNotAllowReminders: EKError.Code
- static var sourceDoesNotAllowEvents: EKError.Code
- static var priorityIsInvalid: EKError.Code
- static var invalidEntityType: EKError.Code
- static var procedureAlarmsNotMutable: EKError.Code
- static var eventStoreNotAuthorized: EKError.Code
- static var osNotSupported: EKError.Code
- static var invalidInviteReplyCalendar: EKError.Code
- static var notificationsCollectionFlagNotSet: EKError.Code
- static var sourceMismatch: EKError.Code
- static var notificationCollectionMismatch: EKError.Code
- static var notificationSavedWithoutCollection: EKError.Code
- static var last: EKError.Code
Error Domain
Type Properties
Constants
- case eventNotMutable
- case noCalendar
- case noStartDate
- case noEndDate
- case datesInverted
- case internalFailure
- case calendarReadOnly
- case durationGreaterThanRecurrence
- case alarmGreaterThanRecurrence
- case startDateTooFarInFuture
- case startDateCollidesWithOtherOccurrence
- case objectBelongsToDifferentStore
- case invitesCannotBeMoved
- case invalidSpan
- case calendarHasNoSource
- case calendarSourceCannotBeModified
- case calendarIsImmutable
- case sourceDoesNotAllowCalendarAddDelete
- case recurringReminderRequiresDueDate
- case structuredLocationsNotSupported
- case reminderLocationsNotSupported
- case alarmProximityNotSupported
- case calendarDoesNotAllowEvents
- case calendarDoesNotAllowReminders
- case sourceDoesNotAllowReminders
- case sourceDoesNotAllowEvents
- case priorityIsInvalid
- case invalidEntityType
- case procedureAlarmsNotMutable
- case eventStoreNotAuthorized
- case osNotSupported
- case invalidInviteReplyCalendar
- case notificationsCollectionFlagNotSet
- case sourceMismatch
- case notificationCollectionMismatch
- case notificationSavedWithoutCollection
- case last
Enumeration Cases
Initializers
---
Extracted from Apple DocC JSON by apple-skills tooling. This is unofficial content. All documentation belongs to Apple Inc.