Hi everyone,
I'm building a task management app that layers on top of EventKit/Reminders. I'm also moderating /r/AppleReminders.
I see a confusion around the semantics of dates on both the developer side and on the user side.
I'm trying to map the standard productivity mental model to the EKReminder implementation and hitting some walls.
In productivity contexts, a task tends to have three distinct dates:
Start Date: When the task becomes actionable — Don’t alert the user before this date.
Notification: When the device should buzz/ping the user — Meaning that they can get started on the task.
Due Date: Hard deadline — If the system works well, tasks are meant to rarely be past-deadline; productivity systems are about meeting deadlines rather than about missing them.
The EventKit Reality
Here is what I’m seeing in practice, and I’m hoping someone can correct me if I’m wrong:
Field
Description
In Practice (Reminders App)
startDateComponents
Docs say "start date of the task"
Seemingly unused? I can set it via API, but the Reminders app UI ignores it. It doesn't seem to trigger visibility in "Today" or Smart Lists.
dueDateComponents
Docs say "date by which reminder should be completed"
Conflated. Acts as the "Date" you see in the list. It functions as the Start Date (shows in Today), Due Date (turns red tomorrow), AND Notification time (unless early alerts are set).
alarms
Inherited from EKCalendarItem
seems to be used for the actual notifications, including "Early Reminders," but tightly coupled to the due date in the UI.
My Questions:
Is startDateComponents effectively a dead field? Is there any native behavior (Smart List filtering, sorting, visibility) that respects this field, or is it purely for metadata storage for third-party apps?
Smart List Logic: I was hoping to create a Smart List that shows "Actionable" items (i.e., Start Date <= Today). However, the Smart List filters only offer a generic "Date" field, which maps to dueDateComponents. Has anyone successfully filtered by startDateComponents in a native Smart List?
Conflation: Is there any "blessed" way to set a Due Date that is distinct from the Notification time without fighting the system? (e.g. Due Friday, but remind me Wednesday).
Any insight into the intended semantics here would be huge. I'm trying to avoid fighting the framework, but the "One Date to Rule Them All" approach in the Reminders app is making it tricky to support separate Start/Due dates.
Thanks!
EventKit
RSS for tagCreate, view, and edit calendar and reminder events using EventKit and EventKitUI. Request read-only, write-only, or full-access to Calendar data.
Posts under EventKit tag
13 Posts
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Hello,
Regarding EKEventStore, the WWDC session mentions that “you should only have one of these for your application.”
In my app, I need to use the instance on both the main thread and a background thread, and I would like to share a single instance across them.
However, EKEventStore is a non-sendable type, so it cannot be shared across different isolation domains.
I would like to know what the recommended best practice is for this situation.
Also, do I need to protect the instance from data races by using a lock?
Thank you.
I would like the function in the calendar app to be able to assign a status to the set appointment, such as unconfirmed or pending.
Hello,I try to get all contacts from an iCoud Account...First I run:< ?xml version="1.0" encoding="UTF-8" ?>
< d:propfind xmlns:d="DAV: ">
< d:prop >
< d:current-user-principal/ >
< /d:prop >
< /d:propfind >Then I get /xxxxxxxxxxx/carddavhome/ and run:< ?xml version="1.0" encoding="UTF-8"? >
< d:propfind xmlns:d="DAV:" xmlns:card="urn:ietf:params:xml:ns:carddav" >
< d:prop >
< card:addressbook-home-set/ >
< /d:prop >
< /d:propfind >This give me the URL https://pXX-contacts.icloud.com:443/xxxxxxxxxxx/carddavhome/ then I send the following request to this URL:< ?xml version="1.0" encoding="UTF-8"? >
< d:propfind xmlns:d="DAV:" xmlns:card="urn:ietf:params:xml:ns:carddav" >
< d:prop >
< d:displayname/ >
< d:resourcetype/ >
< /d:prop >
< /d:propfind >And I get:< ?xml version="1.0" encoding="UTF-8"? >
< multistatus xmlns="DAV:" >
< response >
< href >/xxxxxxxxxxx/carddavhome/< /href >
< propstat >
< prop >
< resourcetype >
< collection/ >
< /resourcetype >
< /prop >
< status >HTTP/1.1 200 OK< /status >
< /propstat >
< propstat >
< prop >
< displayname/ >
< /prop >
< status >HTTP/1.1 404 Not Found< /status >
< /propstat >
< /response >
< /multistatus >If I try to run this to the the URL https://pXX-contacts.icloud.com:443/xxxxxxxxxxx/carddavhome/contacts< ?xml version="1.0" encoding="UTF-8"? >
< card:addressbook-query xmlns:d="DAV:" xmlns:card="urn:ietf:params:xml:ns:carddav" >
< d:prop >
< d:getetag/ >
< card:address-data/ >
< /d:prop >
< /card:addressbook-query >I get: Improperly formed XML encountered, unexpected root nodeWhat is my mistake? The first 2 queries work and give me the expected results, the 3rd one should give me a list of the addressbooks and groups and the 4th one should give me all VCards.
EKEventStore on Apple Watch is not giving me all calendars.
I can see only calendars of the source 'Subscriptions', but non of the calendars of source CalDAV (iCloud).
This problem exists over multiple apps. Code works fine on iPhone. Any ideas?
Minimal example code:
import SwiftUI
import EventKit
struct ContentView: View {
let eventStore = EKEventStore()
@State var success: Bool = false
@State var calendarNames: [String] = [String]()
func request() async {
success = (try? await eventStore.requestFullAccessToEvents()) ?? false
}
func list() {
calendarNames = eventStore.calendars(for: .event).map { $0.title }
}
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Access: \(success.description)")
ScrollView {
ForEach(calendarNames, id: \.self) { name in
Text(name)
}
}
}
.onAppear {
Task {
await request()
list()
}
}
.padding()
}
}
Our app provides a calendar that integrates with the default calendar app. Specifically, we use iOS EventKit to perform CRUD operations on calendar data.
Recently, we have received reports from users that all of their events have disappeared. However, after reviewing our implementation and logs, we have not been able to identify the cause. Some users have also reported that all data in their default calendar app has disappeared as well.
Does anyone have any idea what might be causing this?
To delete an event within our app, users must press the delete button and then confirm the deletion in a dialog. Additionally, it is not possible to delete more than two events at once.
We've seen many people in the community discussing a bug where calendar events disappear after updating to iOS 18. If you have any information about when or why this happens, we'd appreciate it if you could share your insights.
Since iOS 18.4 and macOS 15.4 updating the calendar of an (ek)event (to another accounts calendar) or detaching an repeating event throws an error while saving:
"Access denied"
EKEventStore.save(event, span: .thisEvent, commit: true)
catch {
"Access denied"
}
Hello, I have implemented my virtual meeting extension and my application shows no issues in the calendar application, with a join button displayed. Everything is great!.
However, with the help of EKEventEditViewController and EKEvent instances, when creating an event from the main target of the application using EventKitUI, the event will not be displayed as a virtual meeting.
I have seen that other applications like Zoom have already implemented this, and I find it difficult to find relevant documentation on how to link events created by the program to virtual meetings.
How do I set an event as a meeting when I want to add it to the main program? In addition, the function in the VirtualConferenceProvider.swift file of the extension program fetchVirtualConference(identifier: EKVirtualConferenceRoomTypeIdentifier, completionHandler: @escaping (EKVirtualConferenceDescriptor?, (any Error)? )->Void) How are the parameters in this function obtained? It's impossible for every conference related link to be the same
I'm running into issues with iOS respecting the HTTP 410 "Gone" response type.
Setup:
Using the native iOS Calendar app, add a new subscription calendar. "Add Subscription Calendar"
Add the URL of a ICS calendar subscription that you control, e.g. https://mywebsite.com/userfeeds/23/cal.ics
Make sure to select the "Account" option and choose "On My iPhone/iPad". Set the query amount to 15 mins.
Calendar events show as expected, device queries the latest updates from the server every 15 minutes. Server returns HTTP 200 with the .ics contents.
Now, assume there is a need for the feed to end - maybe the user unsubscribed to mywebsite.com. There is currently no way for the mywebsite.com server / response to tell the device the feed has ended and it should stop requesting. If the user forgets to go to calendar and manually unsubscribe the device will continually ping the server every 15 minutes indefinitely. It's turning into a virtual DoS for my platform.
iOS should respect the HTTP 410 "Gone" header or something similar. If the server returns a HTTP 410 response code for https://mywebsite.com/userfeeds/23/cal.ics X amount of times, the feed should be automatically removed.
I've opened several tickets over the last 3 years and have not even had a status change on the tickets.
Does anyone know how to resolve this or a work around?
Since iOS 18.4 and macOS 15.4 updating the calendar of an (ek)event (to another accounts calendar) or detaching an repeating event throws an error while saving: "Access denied"
EKEventStore.save(event, span: .thisEvent, commit: true)
catch { "Access denied" }
Device: iPhone 16 Pro
iOS version: 18.3.2
The calendar widget (on home screen) is displaying "No more events today" even though there is an appointment scheduled later in the evening on the same day.
I have looked through all the settings and nothing seems to work. How do I get it to display events that are on the calendar for rest of the day today.
It does correctly display events that are upcoming tomorrow and next week.
Thanks,
-Harry
Hi everyone,
We’re integrating Apple Calendar (iCalendar) into our Codapet app but haven’t found any official Apple APIs for event management and synchronisation.
Currently, we use CalDAV with Apple ID authentication and an app-specific password (ASP), storing the ASP encrypted in our database and decrypting it for each API call. We’re looking for a more secure and recommended approach to this integration.
Does Apple provide dedicated APIs for calendar sync, or is there a better alternative to avoid sending the ASP with every request? Any guidance or best practices would be greatly appreciated!
Thanks!
When using EKCalendarChooser it shows a list of calendars that the user can select, however it shows the Siri Suggestions calendar but theres no way to access it.
Are supposed to be able to access the Siri Suggestions calendar as a regular EKCalendar?
If yes is there a way to persist the selection (currently you can select the Siri Suggestions calendar [as shown in the image] but it doesn't have an actual id so it doesn't persist)?
Also when getting EventStore.calendars(for: .event) it doesnt return an EKCalendar for Siri Suggestions, only for all the other calendars. This leads me to believe we can't access it, which in that case why is it shown on the EKCalendarChooser and there doesn't seem to be a way to hide it.
Also is there a way to hide the AddCalendar Button in the bottom left?