본문 바로가기
프로그래밍/Xcode-iOS

[iOS] Event Kit 이용하여 일정 등록 하는 방법

by Mr-후 2017. 4. 26.
반응형


일정 관리 앱을 만들다 보면 앱 자체에서 생성된 일정을 아이폰이나 아이패드 일정앱에 등록하고 싶을때가 있다. 

프로젝트 진행시 요구사항으로 나왔던 기능이라 아이폰 개발 관련 도서를 뒤져서 찾아보니 과연 관련 프레임워크가 있다. 


EKEvent 프레임인데 역시 사용권한에 대한 수락이 있어야 가능하기에 

권한 부여 하는 방법과 일정으로 등록되는 세부 항목에 대해서 살펴 볼 필요가 있다. 


Event Kit Framework는 캐린더 데이터베이스에 접근할 수 있게 하며 이벤트와 미리 알림, 알람을 관리할 수 있도록 설계되었다. 

미리 알림을 iOS 어플리케이션에 통합하기 위해서는 EKCalendar, EKEventStore, EKReminder, EKAlarm클래스들에 대해 학습이 필요하다. 


EKEventStore는 어플리케이션들과 그 베이스에 있는 캘린더 데이터베이스 간의 인터페이스 제공 역할을 한다. 캘린더 데이터베이스는 여러개의 캘린더를 가질 수 있으며 각각의 캘린더는 EKCalendar객체의 형태로 코드에 표시된다. 


각각의 캘린더에는 이벤트, 미리 알림들이 들어가며 각각은 EKEvent와 EKRemindr클래스를 이용하는 코드에서 관리. 

EKAlarm클래스는 미래의 특정 시점에서 사용자에게 알려주기 위하여 알람을 구성하는데 사용된다. 


EKEvent 사용을 하기 위해서는 해당 프레임워크가 추가되어 있어야한다. 

#import <EventKit/EventKit.h> 

#import <EventKitUI/EventKitUI.h>


일정에 접근할 수 있는 권한을 획득하기 위한 예제 코드. EKAuthorizationStatus를 통해 상태를 받아오고 각 상태에 따른 분기 코드를 작성한다. 


        EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];

        

        // 사용자에게 아직 접근 허가를 요구하지 않은 경우

        if (status == EKAuthorizationStatusNotDetermined) {

            [self.eventStore requestAccessToEntityType:EKEntityTypeEvent

                                            completion:^(BOOL granted, NSError * _Nullable error) {

                                                if (granted) {

                                                    // 사용자가 달력으로의 접근을 허가하는 경우 granted true 들어온다

                                                    dispatch_async(dispatch_get_main_queue(), ^{

                                                       

                                                        [self shereScheduleEvent:schedule];

                                                    });

                                                } else {

                                                    

                                                }

                                            }];

        }

        // iPhone 설정의 '사용자 정보 보호'에서 달력에 대한 접근을 제한하는 경우

        else if (status == EKAuthorizationStatusRestricted) {

            //"일정 앱에 접근 권한이 없습니다."

        }

        // 달력에 대한 접근을 사용자가 거부한 경우

        else if (status == EKAuthorizationStatusDenied) {

            //"일정 앱에 접근 권한이 없습니다."

        }

        // 달력에 대한 접근을 사용자가 허가한 경우

        else if (status == EKAuthorizationStatusAuthorized) {

            [self shereScheduleEvent:schedule];

        }


각 상태에 따른 작업을 처리하면 되도록 구성된 예제 소스. 

그리고 실제 일정(스케쥴)을 등록하는 함수 내부 구조는 다음과 같다. 


다음은 실제 알림앱에 이벤트를 등록하는 절차이다. 

복잡한건 없으며 기본적인 제목과 시작, 종료, 하루종일 여부 정도이며 세부적인 프로퍼티는 프레임워크 헤더를 참고 하면 도움이 된다.



- (void)shereScheduleEvent:(Schedule *)schedule {

    EKEvent *event = [EKEvent eventWithEventStore:self.eventStore];

    event.title = schedule.sked_name;

    

    NSDate *sDate = [NSDate dateWithTimeIntervalSince1970:[schedule.sked_begin  doubleValue]/1000.f];

    NSDate *eDate = [NSDate dateWithTimeIntervalSince1970:[schedule.sked_end  doubleValue]/1000.f];

    NSDate *alrim_date = [NSDate dateWithTimeIntervalSince1970:[schedule.alrim_date  doubleValue]/1000.f];

    event.startDate = sDate;

    event.endDate = eDate;

    event.allDay = schedule.is_allday.integerValue;

    

    if (schedule.alrim_date.integerValue > 0) {

        event.alarms = @[[EKAlarm alarmWithAbsoluteDate:alrim_date]];

    }

    

    if (schedule.lng.floatValue > 0) {

        EKStructuredLocation *loc = [EKStructuredLocation locationWithTitle:schedule.poi_name];

        loc.geoLocation = [[CLLocation alloc] initWithLatitude:schedule.lati.floatValue longitude:schedule.lng.floatValue];

        event.structuredLocation = loc;

    }


    dispatch_async(dispatch_get_main_queue(), ^{

        EKEventEditViewController *controller = [[EKEventEditViewController alloc] init];

        controller.event = event;

        controller.eventStore = self.eventStore;

        controller.editViewDelegate = self;

        

        [self presentViewController:controller animated:YES completion:nil];

    });

}



EKEventEditViewController를 사용하기위해서 위에 추가된 프레임워크를 참고하면 된다. 

EKEvent 프레임워크 header 파일을 참조 하면 어떤 속성과 값들이 있는지 알 수 있다. 


일반적으로 일정의 시작일자와 종료일자를 설정할 수 있으며, 알림 데이터도 설정할 수 있다. 


또 EKStructuredLocation을 이용해 특정 위치도 위경도 값으로 설정할 수 있으므로 특정 지역으로 이동했을 때 Local Notification을 통해 알림을 받을 수 있도록 설정 가능하다.


이벤트 제목과 하루종일 여부, 알림, 위치 등의 정보를 등록해서 개발된 앱의 일정과 아이폰의 일정앱과 일정을 동기화 할 수 있는 방법이며 미리알림의 경우 EKReminder 클래스를 문서를 참고해서 찾아보면 쉽게 구현할 수 있다. 


다양한 상상력이 결합되면 꽤 괜찮은 일정 앱을 만들 수 있을 것 같다. 

반응형