이번 글에서는 아이폰 캘린더 연동을 위한 EventKit에 대해서 알아보겠습니다. EventKit은 iOS에서 제공하는 프레임워크로 사용자의 캘린더와 미리 알림 데이터를 관리할 수 있는 기능을 제공합니다. 이를 통해 사용자가 생성한 이벤트를 읽거나 새로운 이벤트를 추가하는 것이 가능합니다.
EventKit는 다음과 같은 주요 기능이 있습니다.
EventKit 사용 방법은 다음과 같습니다.
개발할 때 필요한 프레임워크들을 import합니다. 저는 빌드를 위한 SwiftUI와 EventKit만 사용하겠습니다.
import SwiftUI
import EventKit
이벤트를 위한 모델을 생성합니다. 저는 이벤트 id, 프로퍼티로 제목, 날짜만 넣었습니다.
// Event.Swift
import SwiftUI
struct Event: Identifiable {
let id: UUID = UUID()
let title: String
let date: Date
}
뷰를 그립니다.
// ContentView.swift
import SwiftUI
import EventKit
struct ContentView: View {
@State var showAlert: Bool = false
@State var alertTitle: String = ""
@State var alertMessage: String = ""
let events: [Event] = [
Event(title: "9일 뒤", date: Date() + 86400 * 9),
Event(title: "5일 뒤", date: Date() + 86400 * 5)
]
let formatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "dd LLL YYYY"
return formatter
}()
var body: some View {
List {
ForEach(events) { event in
Button {
requestCalendarAccess(event)
} label: {
HStack {
Text("\(formatter.string(from: event.date))")
Text(event.title)
.font(.headline)
}
}
}
}
.alert(isPresented: $showAlert) {
Alert(title: Text(alertTitle), message: Text(alertMessage))
}
}
}
캘린더에 대한 권한을 묻고 동의시 이벤트를 추가하는 함수를 생성합니다.
extension ContentView {
private func requestCalendarAccess(_ event: Event) {
let eventStore = EKEventStore()
eventStore.requestWriteOnlyAccessToEvents() { (granted, error) in
if granted && error == nil {
let calendarEvent = EKEvent(eventStore: eventStore)
calendarEvent.title = event.title
calendarEvent.startDate = event.date
calendarEvent.endDate = event.date.addingTimeInterval(3600)
calendarEvent.calendar = eventStore.defaultCalendarForNewEvents
do {
try eventStore.save(calendarEvent, span: .thisEvent)
alertTitle = "Event Added"
alertMessage = "The event has been successfully added to your calendar."
showAlert = true
} catch {
alertTitle = "Error"
alertMessage = "There was an error adding the event to your calendar."
showAlert = true
}
} else {
alertTitle = "Error"
alertMessage = "Access to the calendar was denied."
showAlert = true
}
}
}
}
위 코드에서 EKEvent타입의 변수인 calendarEvent에 자신이 추가하는 이벤트 프로퍼티를 대입하는데 EKEvent 문서를 보고 더 다양한 프로퍼티들을 넣을 수 있습니다.
Info.plist 파일을 업데이트합니다. 프로젝트의 info탭을 가서 Privacy - Calendars Usage Description 키를 추가합니다.

위 코드를 실행한 화면은 다음과 같습니다.
