SwiftUI - 캘린더 이벤트 추가하기(EventKit)

Marble·2025년 1월 11일

Calendar

목록 보기
3/3

이번 글에서는 아이폰 캘린더 연동을 위한 EventKit에 대해서 알아보겠습니다. EventKit은 iOS에서 제공하는 프레임워크로 사용자의 캘린더와 미리 알림 데이터를 관리할 수 있는 기능을 제공합니다. 이를 통해 사용자가 생성한 이벤트를 읽거나 새로운 이벤트를 추가하는 것이 가능합니다.

주요 기능

EventKit는 다음과 같은 주요 기능이 있습니다.

  • 사용자의 기존 캘린더 및 미리 알림 데이터에 접근 가능
  • 사용자의 캘린더에 새로운 이벤트 및 알림 생성
  • 이벤트 및 미리 알림 수정 및 삭제
  • 특정 날짜의 이벤트 조회

사용 방법

EventKit 사용 방법은 다음과 같습니다.

  1. Import Required Frameworks

개발할 때 필요한 프레임워크들을 import합니다. 저는 빌드를 위한 SwiftUIEventKit만 사용하겠습니다.

import SwiftUI
import EventKit
  1. Create an Event Model

이벤트를 위한 모델을 생성합니다. 저는 이벤트 id, 프로퍼티로 제목, 날짜만 넣었습니다.

// Event.Swift
import SwiftUI

struct Event: Identifiable {
    let id: UUID = UUID()
    let title: String
    let date: Date
}
  1. Build View

뷰를 그립니다.

// 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))
        }
    }
}
  1. Ask the calendar permission and add the event

캘린더에 대한 권한을 묻고 동의시 이벤트를 추가하는 함수를 생성합니다.

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 문서를 보고 더 다양한 프로퍼티들을 넣을 수 있습니다.

  1. Update the Info’s target

Info.plist 파일을 업데이트합니다. 프로젝트의 info탭을 가서 Privacy - Calendars Usage Description 키를 추가합니다.

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

Reference

profile
개발자가 되고 싶은 공돌이

0개의 댓글