프로그래밍 방식으로 iPhone 캘린더에서 사용자 정의 이벤트를 추가합니다

StackOverflow https://stackoverflow.com/questions/246249

  •  05-07-2019
  •  | 
  •  

문제

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

도움이 되었습니까?

해결책

기반 사과 문서, 이것은 iOS 6.0과 같이 약간 변경되었습니다.

1) "requestAccesstoEntityType : 완료 :"를 통해 사용자 캘린더에 대한 액세스를 요청하고 블록 내부에서 이벤트 처리를 실행해야합니다.

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

그룹의 프레임 워크 그룹을 마우스 오른쪽 버튼으로 클릭하고 창 왼쪽에있는 네비게이터를 파일로 클릭하십시오. '추가'를 선택한 다음 '기존 프레임 워크'그런 다음 'Eventkit.framework'를 선택하십시오.

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

#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 캘린더 이벤트를 추가 할 수도 있습니다.

사용 Google의 API Objective-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];
                }
              }];
}

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 !")
            }
        }
    })
}

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.
    }


}

또한 달력 사용 권한을 추가하는 것을 잊지 마십시오image for privary setting

단순 .... tapku 라이브러리 사용 .... 당신은 그 단어를 구글로 만들어서 그것을 사용할 수 있습니다 ... 오픈 소스 ... 즐기십시오 ..... 그 코드로 버그가 필요하지 않습니다 ....

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

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)

            }
        }


       })
    }

}

이제 이벤트 화면을 얻을 수 있으며 여기에서 설정을 수정할 수도 있습니다.

enter image description here

이제 취소를 처리하고 이벤트 버튼을 추가하여 이벤트 화면의 이벤트 버튼 작업을 추가합니다.

    extension viewController: EKEventEditViewDelegate {

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

    }
}

메모: 추가하는 것을 잊지 마십시오 nscalendarsusagedescription 정보가 시작됩니다.

Google 아이디어는 좋은 아이디어이지만 문제가 있습니다.

Google 캘린더 이벤트 화면을 성공적으로 열 수 있지만 기본 데스크탑 버전에서만 OnkiPhari에 제대로 표시되지 않습니다. Safari에 제대로 표시되는 Google 모바일 캘린더는 API와 함께 작동하여 이벤트를 추가하지 않는 것 같습니다.

현재, 나는 이것에서 좋은 방법을 볼 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top