Привет, друзья! Сегодня разберем важную тему: как правильно работать с календарем пользователя в iOS-приложениях. Многие проекты требуют доступа к событиям и напоминаниям, но не все знают тонкости реализации.
Безопасность прежде всего:
Доступ к календарю - это приватные данные пользователя.
Apple строго контролирует такие запросы, поэтому первым делом настраиваем ключи в
Info.plist:
NSCalendarsFullAccessUsageDescription
Мы хотим добавить событие в ваш календарь
NSCalendarsWriteOnlyAccessUsageDescription
Приложение будет создавать события, но не читать существующие
Практический пример запроса доступа:
Вот так реализуется запрос прав на доступ к событиям:
import EventKit
class CalendarManager: ObservableObject {
private let eventStore = EKEventStore()
@Published var accessStatus: EKAuthorizationStatus = .notDetermined
func requestAccess() async throws -> Bool {
let granted = try await eventStore.requestFullAccessToEvents()
await MainActor.run {
accessStatus = EKEventStore.authorizationStatus(for: .event)
}
return granted
}
}
Важные нюансы:
Использование календаря:
После успешного получения прав можно работать с событиями. Вот базовые операции:
import EventKit
class CalendarManager {
private let eventStore = EKEventStore()
// Проверяем доступ и добавляем событие
func addQuickEvent(title: String) -> Bool {
guard EKEventStore.authorizationStatus(for: .event) == .authorized else {
print("Нет доступа к календарю")
return false
}
let event = EKEvent(eventStore: eventStore)
event.title = title
event.startDate = Date() // начинается сейчас
event.endDate = Date().addingTimeInterval(3600) // длится 1 час
event.calendar = eventStore.defaultCalendarForNewEvents
do {
try eventStore.save(event, span: .thisEvent)
print("Событие '\(title)' добавлено")
return true
} catch {
print("Ошибка: \(error.localizedDescription)")
return false
}
}
// Показываем все события на сегодня
func showTodaysEvents() {
guard EKEventStore.authorizationStatus(for: .event) == .authorized else { return }
let startDate = Date()
let endDate = Calendar.current.date(byAdding: .day, value: 1, to: startDate)!
let predicate = eventStore.predicateForEvents(withStart: startDate, end: endDate, calendars: nil)
let events = eventStore.events(matching: predicate)
print("События на сегодня:")
for event in events {
print("• \(event.title ?? "Без названия") - \(event.startDate)")
}
}
}
// Использование
let calendarManager = CalendarManager()
// Добавляем событие
calendarManager.addQuickEvent(title: "Встреча с командой")
// Показываем события
calendarManager.showTodaysEvents()
Рекомендации по использованию:
- Запрашивать доступ в контексте (когда пользователь пытается создать первое событие).
- Предварительно проверять статус и показывать соответствующий UI.
- Всегда обрабатывать сценарий отказа.
- Тестируйте на реальном устройстве, симулятор может не полностью эмулировать права доступа.
Вывод:
EventKit требует строгого соблюдения протокола безопасности. Весь процесс работы с календарем строится на трех обязательных этапах: настройка прав доступа, проверка статуса авторизации и только затем выполнение операций с событиями.