184

カスタム App から iPhone カレンダーに iCal イベントを追加する方法はありますか?

4

11 に答える 11

169

Apple Documentationに基づいて、これは iOS 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
        }
    }
}
于 2013-06-26T22:40:54.780 に答える
153

これは、OS 4.0 の Event Kit フレームワークを使用して行うことができます。

ウィンドウの左側にあるグループとファイルのナビゲーターで、FrameWorks グループを右クリックします。「追加」、「既存の FrameWorks」、「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
于 2010-07-05T04:56:30.230 に答える
13

はい、このためのAPIはまだありません(2.1)。しかし、WWDCでは、多くの人がすでに機能に興味を持っているようでした(私を含む)。以下のサイトにアクセスして、この機能のリクエストを作成することをお勧めします。十分な関心がある場合は、ICal.frameworkをパブリックSDKに移動することになります。

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

于 2008-10-30T02:43:19.917 に答える
12

カレンダーアクセスはiPhoneOS4.0で追加されています

カレンダーアクセス
アプリは、イベントキットを使用してカレンダーアプリで直接イベントを作成および編集できるようになりました。
定期的なイベントを作成し、開始時刻と終了時刻を設定して、デバイス上の任意のカレンダーに割り当てます。

于 2010-05-18T11:53:20.623 に答える
5

Tristan が概説したように Event 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];
                }
              }];
}
于 2012-07-09T14:36:19.873 に答える
1

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
}];
于 2016-07-08T14:34:19.267 に答える
0

Google のアイデアは素晴らしいものですが、問題もあります。

Google カレンダーのイベント画面を正常に開くことができますが、メインのデスクトップ バージョンのみで、iPhone Safari では正しく表示されません。Safari で正しく表示される Google モバイル カレンダーは、イベントを追加する API と連携していないようです。

今のところ、この問題から抜け出す良い方法が見えません。

于 2010-01-21T10:43:58.060 に答える
0

シンプル.... tapku ライブラリを使用.... その単語をググって使用できます... そのオープンソース... 楽しむ..... それらのコードで盗聴する必要はありません....

于 2012-08-28T06:16:32.440 に答える