Я работаю над приложением, которому необходимо публиковать данные в календаре пользователя calDAV (iCloud или другом). Для этого мне нужно определить, позволяет ли этот источник создавать календари и напоминания.
EKSource не предлагает многого с точки зрения обнаружения чего-либо, кроме предоставления вам типа источника (локальный, calDAV, Exchange...)
Единственный способ, который я придумал, чтобы определить, возможно ли это, - это попытаться написать новый календарь и просмотреть любые сообщения об ошибках, например:
-(BOOL)ekSourceWritesToEvents:(EKSource *)ekSource {
BOOL writesToEvents = NO;
//Try to write a calendar to it if it fails, return NO
//If you succeed, return YES, since this is uncommitted, no damage done
NSError *error = nil;
EKCalendar *testCalendar = [EKCalendar calendarForEntityType:EKEntityTypeEvent eventStore:self.eventStore];
testCalendar.title = @"TestCalendar";
testCalendar.source = ekSource;
BOOL result = [self.eventStore saveCalendar:testCalendar commit:NO error:&error];
if (result) {
NSLog(@"This Source can create calendars: %@",ekSource.title);
//Now check if one can create an event
EKEvent *newEvent = [EKEvent eventWithEventStore:self.eventStore];
newEvent.title = @"TestEvent";
newEvent.startDate = [NSDate date];
newEvent.endDate = [NSDate date];
newEvent.calendar = testCalendar;
NSError *eventCreateError = nil;
[self.eventStore saveEvent:newEvent span:EKSpanThisEvent commit:NO error:&eventCreateError];
if (eventCreateError) {
NSLog(@"Cannot Create EKEvent in test Calendar %@",eventCreateError.localizedDescription);
writesToEvents = NO;
} else {
writesToEvents = YES;
//Delete it even if uncommitted or it seems to get commited at some point
NSError *eventDeleteError = nil;
[self.eventStore removeEvent:newEvent span:EKSpanThisEvent commit:YES error:&eventDeleteError];
if (eventDeleteError) {
NSLog(@"Error removing event: %@",eventDeleteError.localizedDescription);
}
}
NSError *calendarDeleteError = nil;
[self.eventStore removeCalendar:testCalendar commit:YES error:&calendarDeleteError];
if (calendarDeleteError) {
NSLog(@"Error removing test calendar: %@",calendarDeleteError.localizedDescription);
}
} else {
NSLog(@"Cannot Save Calendar: %@.", error);
}
return writesToEvents;
}
Я нахожу это неуклюжим способом делать что-то... не будет ли способа правильно это обнаружить? Я бы предпочел, чтобы пользователь знал, чего ожидать, прежде чем выбирать источник назначения, поэтому я хочу сделать это, прежде чем пытаться.
Спасибо!
ОБНОВЛЕНИЕ: кажется, проверки создания календаря недостаточно. Затем вы также должны проверить, что созданный календарь позволяет писать... Я изучаю. Почему можно было создать календарь и запретить ему писать, мне не по плечу...
Обновление 2: кажется, что даже если мы не фиксируем, тестовый календарь каким-то образом создается. Поэтому я добавил код для удаления тестового события и календаря.
ОБНОВЛЕНИЕ 3: Дополнительные проблемы... проверка возможности создания календаря - это еще не все... некоторые службы (Google) позволяют создавать события в календаре, но не в календарях. Вы должны создать Календарь, используя сайт Google или их API. Вдобавок ко всему, кажется, что есть ошибка с серверами Exchange, когда вы пытаетесь создать EKEvent, это фактически дает вам ошибку, что календарь не может создавать напоминания. Странный.