Как создать новый EKCalendar на устройстве iOS?

У меня есть приложение, где я хочу запланировать некоторые события. Поэтому я хочу создать новый календарь для своего приложения, если он еще не существует, и если он ссылается на это при добавлении новых событий.

Ответ 1

Вот как это делается на iOS 5 с помощью рамки EventKit:

Прежде всего вам нужен объект EKEventStore для доступа ко всем:

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

Теперь вам нужно найти источник локального календаря, если вы хотите, чтобы календарь хранился локально. Существуют также источники для обмена счетами, CALDAV, MobileMe и т.д.:

// find local source
EKSource *localSource = nil;
for (EKSource *source in store.sources)
    if (source.sourceType == EKSourceTypeLocal)
    {
        localSource = source;
        break;
    }

Теперь вот часть, в которой вы можете получить свой ранее созданный календарь. Когда календарь создан (см. Ниже), есть идентификатор. Этот идентификатор должен быть сохранен после создания календаря, чтобы ваше приложение снова могло идентифицировать календарь. В этом примере я просто сохранил идентификатор в константе:

NSString *identifier = @"E187D61E-D5B1-4A92-ADE0-6FC2B3AF424F";

Теперь, если у вас еще нет идентификатора, вам нужно создать календарь:

EKCalendar *cal;
if (identifier == nil)
{
    cal = [EKCalendar calendarWithEventStore:store];
    cal.title = @"Demo calendar";
    cal.source = localSource;
    [store saveCalendar:cal commit:YES error:nil];
    NSLog(@"cal id = %@", cal.calendarIdentifier);
}

Вы также можете настроить такие свойства, как цвет календаря и т.д. Важной частью является сохранение идентификатора для последующего использования. С другой стороны, если у вас уже есть идентификатор, вы можете просто выбрать календарь:

else
{
    cal = [store calendarWithIdentifier:identifier];
}

Я также добавил некоторые результаты отладки:

NSLog(@"%@", cal);

Теперь у вас в любом случае есть объект EKCalendar для дальнейшего использования.

EDIT: По состоянию на iOS 6 calendarWithEventStore обесценивается, используйте:

cal = [EKCalendar calendarForEntityType:<#(EKEntityType)#> eventStore:<#(EKEventStore *)#>];