Інтеграція EventKit (системний календар) в iOS-додаток
EventKit — фреймворк для читання та запису подій у системний календар iOS та macOS. Технічно інтегрувати нескладно, але є кілька місць, де розробники стабільно втрачають час.
Дозволи та типові помилки
До iOS 17 EventKit використовував один ключ для запиту доступу до Calendar: NSCalendarsUsageDescription в Info.plist. З iOS 17 Apple розділила доступ на два рівні: тільки запис (NSCalendarsWriteOnlyAccessUsageDescription) та повний доступ (NSCalendarsFullAccessUsageDescription). Додаток, зібраний під iOS 17 SDK без NSCalendarsWriteOnlyAccessUsageDescription, впаде з винятком при спробі створити подію — навіть якщо старий ключ присутній.
Запит доступу через EKEventStore.requestFullAccessToEvents повертає результат асинхронно. Часта помилка — виклик EKEventStore.save відразу після requestAccess без очікування відповіді користувача. Результат: EKErrorCalendarAccessDenied у release-збірці, тому що в симуляторі доступ іноді видається автоматично без діалогу.
Реалізація
Робота з EKEventStore — важкий об'єкт, його створюють один раз та переиспользуют через синглтон або інжектований сервіс. Створення нового екземпляра на кожен запит — утечка пам'яті та сповільнення роботи.
Для створення подій:
let store = EKEventStore()
let event = EKEvent(eventStore: store)
event.title = "Meeting"
event.startDate = startDate
event.endDate = endDate
event.calendar = store.defaultCalendarForNewEvents
event.addAlarm(EKAlarm(relativeOffset: -600)) // -10 хвилин
do {
try store.save(event, span: .thisEvent)
} catch {
// EKErrorNoCalendar, EKErrorEventNotMutable — обробляємо окремо
}
EKSpan.thisEvent vs EKSpan.futureEvents — важливий параметр при роботі з повторюваними подіями. Клієнт хоче змінити одну конкретну подію з серії — використовуємо thisEvent. Хоче змінити все від цієї дати й далі — futureEvents. Помилитися не можна.
Підписка на зміни календаря через EKEventStoreChangedNotification потрібна, якщо додаток відображає список подій: користувач міг змінити подію безпосередньо через системний Calendar.app, й UI потребує оновлення.
Що входить у роботу
- Налаштування
Info.plistпід iOS 16 та iOS 17+ - Запит дозволів з коректною обробкою всіх станів (denied, restricted, fullAccess, writeOnly)
- CRUD-операції з подіями: створення, редагування, видалення
- Робота з повторюваними подіями та нагадуваннями
- Підписка на зміни сховища
- Обробка кількох календарів (iCloud, локальний, Exchange)
Графік
2–3 дні з урахуванням тестування на реальному пристрої під iOS 16 та 17. Вартість розраховується індивідуально.







