IT

iPhone 일정관리에서 사용자 지정 이벤트를 프로그래밍 방식으로 추가

itgroup 2023. 6. 2. 20:22
반응형

iPhone 일정관리에서 사용자 지정 이벤트를 프로그래밍 방식으로 추가

사용자 지정 앱에서 iPhone 캘린더에 iCal 이벤트를 추가할 수 있는 방법이 있습니까?

Apple Documentation을 기반으로 iOS 6.0에서 약간 변경되었습니다.

"requestAccessToEntityType:completion:"을 통해 사용자의 일정관리에 대한 액세스를 요청하고 블록 내에서 이벤트 처리를 실행해야 합니다.

지금 이벤트를 커밋하거나 "커밋" 매개 변수를 저장/제거 호출에 전달해야 합니다.

다른 모든 것들은 그대로 유지됩니다.

EventKit 프레임워크를 추가하고#import <EventKit/EventKit.h>당신의 코드에.

이 예에서는 NSString *savedEventId 인스턴스 속성을 가지고 있습니다.

이벤트 추가하기

    EKEventStore *store = [EKEventStore new];
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (!granted) { return; }
        EKEvent *event = [EKEvent eventWithEventStore:store];
        event.title = @"Event Title";
        event.startDate = [NSDate date]; //today
        event.endDate = [event.startDate dateByAddingTimeInterval:60*60];  //set 1 hour meeting
        event.calendar = [store defaultCalendarForNewEvents];
        NSError *err = nil;
        [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
        self.savedEventId = event.eventIdentifier;  //save the event id if you want to access this later
    }];

이벤트 제거:

    EKEventStore* store = [EKEventStore new];
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (!granted) { return; }
        EKEvent* eventToRemove = [store eventWithIdentifier:self.savedEventId];
        if (eventToRemove) {
            NSError* error = nil;
            [store removeEvent:eventToRemove span:EKSpanThisEvent commit:YES error:&error];
        }
    }];

그러면 기본 달력에 이벤트가 추가됩니다. 여러 개의 달력이 있는 경우 어떤 달력이

스위프트 버전

EventKit 프레임워크를 가져와야 합니다.

import EventKit

이벤트 추가

let store = EKEventStore()
store.requestAccessToEntityType(.Event) {(granted, error) in
    if !granted { return }
    var event = EKEvent(eventStore: store)
    event.title = "Event Title"
    event.startDate = NSDate() //today
    event.endDate = event.startDate.dateByAddingTimeInterval(60*60) //1 hour long meeting
    event.calendar = store.defaultCalendarForNewEvents
    do {
        try store.saveEvent(event, span: .ThisEvent, commit: true)
        self.savedEventId = event.eventIdentifier //save event id to access this particular event later
    } catch {
        // Display error to user
    }
}

이벤트 제거

let store = EKEventStore()
store.requestAccessToEntityType(EKEntityTypeEvent) {(granted, error) in
    if !granted { return }
    let eventToRemove = store.eventWithIdentifier(self.savedEventId)
    if eventToRemove != nil {
        do {
            try store.removeEvent(eventToRemove, span: .ThisEvent, commit: true)
        } catch {
            // Display error to user
        }
    }
}

OS 4.0의 이벤트 키트 프레임워크를 사용하여 이 작업을 수행할 수 있습니다.

창의 왼쪽에 있는 Groups and Files Navigator(그룹 및 파일 탐색기)에서 FrameWorks 그룹을 마우스 오른쪽 버튼으로 클릭합니다.'추가', '기존 FrameWorks', '이벤트 키트'를 차례로 선택합니다.'프레임워크'.

그런 다음 다음과 같은 코드로 이벤트를 추가할 수 있습니다.

#import "EventTestViewController.h"
#import <EventKit/EventKit.h>

@implementation EventTestViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    EKEventStore *eventStore = [[EKEventStore alloc] init];

    EKEvent *event  = [EKEvent eventWithEventStore:eventStore];
    event.title     = @"EVENT TITLE";

    event.startDate = [[NSDate alloc] init];
    event.endDate   = [[NSDate alloc] initWithTimeInterval:600 sinceDate:event.startDate];

    [event setCalendar:[eventStore defaultCalendarForNewEvents]];
    NSError *err;
    [eventStore saveEvent:event span:EKSpanThisEvent error:&err];       
}

@end

예, 이에 대한 API(2.1)는 아직 없습니다.하지만 WWDC에서는 이미 많은 사람들이 (나 자신을 포함한) 기능에 관심을 가지고 있는 것처럼 보였고, 아래 사이트로 이동하여 이에 대한 기능 요청을 생성하는 것이 권장되었습니다.관심사가 충분하면 ICal.framework를 공용 SDK로 이동할 수 있습니다.

https://developer.apple.com/bugreporter/

iPhone OS 4.0에서 캘린더 액세스가 추가되고 있습니다.

일정관리 액세스
이제 앱은 이벤트 키트를 사용하여 캘린더 앱에서 직접 이벤트를 만들고 편집할 수 있습니다.
반복 이벤트를 만들고 시작 시간과 종료 시간을 설정한 다음 장치의 일정관리에 할당합니다.

Swift 4.0 구현:

페이지 맨 위에 가져오기 사용import EventKit

그리고나서

@IBAction func addtoCalendarClicked(sender: AnyObject) {

    let eventStore = EKEventStore()

    eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in

        if (granted) && (error == nil) {
            print("granted \(granted)")
            print("error \(error)")

            let event = EKEvent(eventStore: eventStore)

            event.title = "Event Title"
            event.startDate = Date()
            event.endDate = Date()
            event.notes = "Event Details Here"
            event.calendar = eventStore.defaultCalendarForNewEvents

            var event_id = ""
            do {
                try eventStore.save(event, span: .thisEvent)
                event_id = event.eventIdentifier
            }
            catch let error as NSError {
                print("json error: \(error.localizedDescription)")
            }

            if(event_id != ""){
                print("event added !")
            }
        }
    })
}

트리스탄이 설명한 것처럼 이벤트 API를 사용하여 이벤트를 추가할 수 있으며 iOS 캘린더에 표시되는 Google 캘린더 이벤트를 추가할 수도 있습니다.

Google의 API Objective-C Client 사용

  - (void)addAnEvent {
  // Make a new event, and show it to the user to edit
  GTLCalendarEvent *newEvent = [GTLCalendarEvent object];
  newEvent.summary = @"Sample Added Event";
  newEvent.descriptionProperty = @"Description of sample added event";

  // We'll set the start time to now, and the end time to an hour from now,
  // with a reminder 10 minutes before
  NSDate *anHourFromNow = [NSDate dateWithTimeIntervalSinceNow:60*60];
  GTLDateTime *startDateTime = [GTLDateTime dateTimeWithDate:[NSDate date]
                                                    timeZone:[NSTimeZone systemTimeZone]];
  GTLDateTime *endDateTime = [GTLDateTime dateTimeWithDate:anHourFromNow
                                                  timeZone:[NSTimeZone systemTimeZone]];

  newEvent.start = [GTLCalendarEventDateTime object];
  newEvent.start.dateTime = startDateTime;

  newEvent.end = [GTLCalendarEventDateTime object];
  newEvent.end.dateTime = endDateTime;

  GTLCalendarEventReminder *reminder = [GTLCalendarEventReminder object];
  reminder.minutes = [NSNumber numberWithInteger:10];
  reminder.method = @"email";

  newEvent.reminders = [GTLCalendarEventReminders object];
  newEvent.reminders.overrides = [NSArray arrayWithObject:reminder];
  newEvent.reminders.useDefault = [NSNumber numberWithBool:NO];

  // Display the event edit dialog
  EditEventWindowController *controller = [[[EditEventWindowController alloc] init] autorelease];
  [controller runModalForWindow:[self window]
                          event:newEvent
              completionHandler:^(NSInteger returnCode, GTLCalendarEvent *event) {
                // Callback
                if (returnCode == NSOKButton) {
                  [self addEvent:event];
                }
              }];
}

Dashrath 응답에 대한 swift 4에 대한 업데이트

import UIKit
import EventKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let eventStore = EKEventStore()

        eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in

            if (granted) && (error == nil) {


                let event = EKEvent(eventStore: eventStore)

                event.title = "My Event"
                event.startDate = Date(timeIntervalSinceNow: TimeInterval())
                event.endDate = Date(timeIntervalSinceNow: TimeInterval())
                event.notes = "Yeah!!!"
                event.calendar = eventStore.defaultCalendarForNewEvents

                var event_id = ""
                do{
                    try eventStore.save(event, span: .thisEvent)
                    event_id = event.eventIdentifier
                }
                catch let error as NSError {
                    print("json error: \(error.localizedDescription)")
                }

                if(event_id != ""){
                    print("event added !")
                }
            }
        })
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

또한 일정관리 사용 권한을 추가하는 것도 잊지 마십시오.

Swift-4.2의 작업 코드

import UIKit
import EventKit
import EventKitUI

class yourViewController: UIViewController{

    let eventStore = EKEventStore()

    func addEventToCalendar() {

    eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in
        DispatchQueue.main.async {
            if (granted) && (error == nil) {
                let event = EKEvent(eventStore: self.eventStore)
                event.title = self.headerDescription
                event.startDate = self.parse(self.requestDetails.value(forKey: "session_time") as? String ?? "")
                event.endDate = self.parse(self.requestDetails.value(forKey: "session_end_time") as? String ?? "")
                let eventController = EKEventEditViewController()
                eventController.event = event
                eventController.eventStore = self.eventStore
                eventController.editViewDelegate = self
                self.present(eventController, animated: true, completion: nil)

            }
        }


       })
    }

}

이제 이벤트 화면이 나타나고 여기서 설정을 수정할 수도 있습니다.

여기에 이미지 설명 입력

이제 취소 처리를 위한 대리자 메서드를 추가하고 이벤트 화면의 이벤트 버튼 동작을 추가합니다.

    extension viewController: EKEventEditViewDelegate {

    func eventEditViewController(_ controller: EKEventEditViewController, didCompleteWith action: EKEventEditViewAction) {
        controller.dismiss(animated: true, completion: nil)

    }
}

참고: NSCalendarsUsageDescription 키를 인포리스트에 추가하는 것을 잊지 마십시오.

endDate를 생성된 이벤트로 설정해야 합니다. 필수 항목입니다.

그렇지 않으면 다음 오류와 함께 실패합니다(거의 자동으로).

"Error Domain=EKErrorDomain Code=3 "No end date has been set." UserInfo={NSLocalizedDescription=No end date has been set.}"

저의 전체 작업 코드는 다음과 같습니다.

EKEventStore *store = [EKEventStore new];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
    if (!granted) { return; }
    EKEvent *calendarEvent = [EKEvent eventWithEventStore:store];
    calendarEvent.title = [NSString stringWithFormat:@"CEmprendedor: %@", _event.name];
    calendarEvent.startDate = _event.date;
    // 5 hours of duration, we must add the duration of the event to the API
    NSDate *endDate = [_event.date dateByAddingTimeInterval:60*60*5];
    calendarEvent.endDate = endDate;
    calendarEvent.calendar = [store defaultCalendarForNewEvents];
    NSError *err = nil;
    [store saveEvent:calendarEvent span:EKSpanThisEvent commit:YES error:&err];
    self.savedEventId = calendarEvent.eventIdentifier;  //saving the calendar event id to possibly deleted them
}];

구글의 아이디어는 좋지만 문제가 있습니다.

Google 캘린더 이벤트 화면을 성공적으로 열 수 있지만 기본 데스크톱 버전에서만 열 수 있고 iPhone Safari에서 제대로 표시되지 않습니다.Safari에서 제대로 표시되는 Google 모바일 달력은 API와 함께 작동하지 않아 이벤트를 추가할 수 없습니다.

지금으로서는, 이것에서 벗어날 좋은 방법을 찾을 수가 없습니다.

단순...tapku 라이브러리를 사용합니다.당신은 그 단어를 구글에 검색해서 사용할 수 있습니다...그 오픈 소스는...즐기세요... 그 코드들로 도청할 필요 없어요...

언급URL : https://stackoverflow.com/questions/246249/programmatically-add-custom-event-in-the-iphone-calendar

반응형