Swift 미리알림 Data가져오기(and 버전 이슈)

yong·2024년 8월 13일

Swift

목록 보기
1/7
post-thumbnail

아이폰 내에 있는 reminder데이터 가져오기 위해 EventKit의

EKEventStore().requestAccess(to: EKEntityType)

사용해서 데이터를 가져오려고 했는데...이게 Ios 17.0부터는 deprecated되었다는 정보가 있었음..(사진 1 참고)(사진 1)

그래서 해결방법은
-requestWriteOnlyAccessToEventsWithCompletion:,
or -requestFullAccessToRemindersWithCompletion:

을 쓰는 방법이 있었음

그래서 필자는 캘린더의 모든 데이터를 원하기 때문에
requestFullAccessToRemindersWithCompletion를 쓰기로 함

requestFullAccessToRemindersWithCompletion

이렇게 사용했지만..최신버전에서 저 이름이 아닌
requestFullAccessToReminders이걸로 바뀌었다고 한다..;;
(사진 2 참고)

(사진 2)

그래서 다시 수정..

 func requestRemindersAccess() {
    eventStore.requestFullAccessToReminders { (granted, error) in
                DispatchQueue.main.async {
                    if let error = error {
                        print("Error requesting reminders access: \(error.localizedDescription)")
                        return
                    }

                    if granted {
                        print("Access granted, now fetching reminders.")
                        self.fetchReminders()
                    } else {
                        print("Reminders access denied. Please enable access in System Preferences.")
                    }
                }
            }
 }
 
 func fetchReminders() {
        let predicate = eventStore.predicateForReminders(in: nil)
        
        eventStore.fetchReminders(matching: predicate) { reminders in
            print("fetchReminders completion block called")
            if let reminders = reminders {
                if reminders.isEmpty {
                    print("No reminders found.")
                } else {
                    for reminder in reminders {
                        print("Reminder Title: \(reminder.title ?? "No Title")")
                        print("Completion Date: \(String(describing: reminder.completionDate))")
                        print("Due Date: \(String(describing: reminder.dueDateComponents?.date))")
                        print("-------------------------------")
                    }
                }
            } else {
                print("No reminders found or an error occurred.")
            }
        }
    }            
            
            

결과

잘나옴 ㅎㅎ

마지막으로 버전별로 대응을 하기 위해 조금만 더 수정하면

class CalendarManager {
    let eventStore = EKEventStore()

    func requestRemindersAccess() {
        if #available(macOS 17, *) {
            // macOS 17 이상
            eventStore.requestFullAccessToReminders { (granted, error) in
                DispatchQueue.main.async {
                    if let error = error {
                        print("Error requesting reminders access: \(error.localizedDescription)")
                        return
                    }

                    if granted {
                        print("Access granted, now fetching reminders.")
                        self.fetchReminders()
                    } else {
                        print("Reminders access denied. Please enable access in System Preferences.")
                    }
                }
            }
        } else {
            // macOS 17 이하
            eventStore.requestAccess(to: .reminder) { (granted, error) in
                DispatchQueue.main.async {
                    if let error = error {
                        print("Error requesting reminders access: \(error.localizedDescription)")
                        return
                    }

                    if granted {
                        print("Access granted, now fetching reminders.")
                        self.fetchReminders()
                    } else {
                        print("Reminders access denied. Please enable access in System Preferences.")
                    }
                }
            }
        }
    }

    func fetchReminders() {
        let predicate = eventStore.predicateForReminders(in: nil)
        
        eventStore.fetchReminders(matching: predicate) { reminders in
            print("fetchReminders completion block called")
            if let reminders = reminders {
                if reminders.isEmpty {
                    print("No reminders found.")
                } else {
                    for reminder in reminders {
                        print("Reminder Title: \(reminder.title ?? "No Title")")
                        print("Completion Date: \(String(describing: reminder.completionDate))")
                        print("Due Date: \(String(describing: reminder.dueDateComponents?.date))")
                        print("-------------------------------")
                    }
                }
            } else {
                print("No reminders found or an error occurred.")
            }
        }
    }
}

완성!

profile
배우고 경험한거 꾸준히 복습

0개의 댓글