TGViewer
Мобильный трудоголик Мобильный трудоголик @hardworkerit · 1.64K subscribers
Post #219 1.24K
🔢 EventKit: как получить доступ к календарю пользователя в iOS.

Привет, друзья! Сегодня разберем важную тему: как правильно работать с календарем пользователя в iOS-приложениях. Многие проекты требуют доступа к событиям и напоминаниям, но не все знают тонкости реализации.


Безопасность прежде всего.

Доступ к календарю - это приватные данные пользователя. Apple строго контролирует такие запросы, поэтому первым делом настраиваем ключи в Info.plist:

<key>NSCalendarsFullAccessUsageDescription</key>
<string>Мы хотим добавить событие в ваш календарь</string>
<key>NSCalendarsWriteOnlyAccessUsageDescription</key>
<string>Приложение будет создавать события, но не читать существующие</string>



Практический пример запроса доступа.

Вот так реализуется запрос прав на доступ к событиям:

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
}
}


Важные нюансы:

🔹 Write-only доступ: идеален для приложений, которые только добавляют события (билеты, бронирования).
🔹 Full access: нужен там, где требуется чтение и анализ расписания.
🔹 Статус авторизации всегда проверяйте перед операциями:

func canAddEvents() -> Bool {
let status = EKEventStore.authorizationStatus(for: .event)
return status == .authorized || status == .writeOnly
}



Использование календаря.

После успешного получения прав можно работать с событиями. Вот базовые операции:

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 требует строгого соблюдения протокола безопасности. Весь процесс работы с календарем строится на трех обязательных этапах: настройка прав доступа, проверка статуса авторизации и только затем выполнение операций с событиями.


➡️ Подписаться на канал
Мобильный трудоголик
  • 👍 13
  • ❤ 8
  • 🤝 4
  • 🤯 1
More from @hardworkerit
  1. Oct 6, 2026🔢 Swift 6.4: новая диагностика ретейн циклов. В Swift 6.4 появилась новая диагностика, ко…
  2. Oct 4, 2026🔢 SwiftUI: определение угла раскрытия iPhone Duo. В iOS 27.1 появился модификатор .onHing…
  3. Oct 2, 2026👣 Архитекторы, тестировщики и кодеры. Создаем мультиагентную команду Разработка с ИИ-аген…
  4. Oct 1, 2026🔢 Работа с Picture-in-Picture в iOS. Picture-in-Picture - системная функция iOS, которая…
  5. Sep 29, 2026🔢 Управление тулбарами на iPhone Duo. На iPhone Duo элементы управления навигацией, дейст…
  6. Sep 27, 2026🔢 Новые возможности Hashable в Swift 6.4 В Swift 6.4 добавили Hashable для нескольких тип…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →