[ios] 프로그래밍 방식으로 iPhone 캘린더에 커스텀 이벤트 추가

커스텀 앱에서 iCal 이벤트를 iPhone 캘린더에 추가하는 방법이 있습니까?



답변

를 기반으로 애플 문서 , 이것은 아이폰 OS 6.0로 약간 변경되었습니다.

1) “requestAccessToEntityType : completion :”을 통해 사용자 캘린더에 대한 액세스를 요청하고 블록 내에서 이벤트 처리를 실행해야합니다.

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

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

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에서 이벤트 키트 프레임 워크를 사용하여이를 수행 할 수 있습니다.

창의 왼쪽에있는 그룹 및 파일 네비게이터에서 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에 캘린더 액세스가 추가되고 있습니다 :

캘린더 액세스
앱은 이제 이벤트 키트를 사용하여 캘린더 앱에서 직접 이벤트를 만들고 편집 할 수 있습니다.
되풀이 이벤트를 생성하고 시작 및 종료 시간을 설정 한 후 장치의 캘린더에 할당합니다.


답변

Tristan 개요와 같은 이벤트 API를 사용하여 이벤트를 추가 할 수 있으며 iOS 캘린더에 표시되는 Google 캘린더 이벤트를 추가 할 수도 있습니다.

사용하는 구글의 API 목표 – C 클라이언트

  - (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];
                }
              }];
}


답변

스위프트 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 !")
            }
        }
    })
}


답변

Dashrath 답변에 대한 신속한 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.
    }


}

또한 캘린더 사용 권한을 추가하는 것을 잊지 마십시오
개인 설정 용 이미지