Ошибка получения приглашений общего календаря для типов сущностей 3, Xcode 6.1.1. EKCalender, EKSource, EKEventstore и Objective C
Я разрабатываю приложение для календаря. Я пытаюсь сохранить EKEvent с помощью назначенного EKCalender. Но когда я пытаюсь запустить следующий код, он дает мне ошибку. Пожалуйста, помогите
-(BOOL)createEventWithTitle:(NSString *)paramTitle startDate:(NSDate *)paramStartDate endDate:(NSDate *)paramEndDate inCalendar:(EKCalendar *)paramCalendar inEventStore:(EKEventStore *)paramStore notes:(NSString *)paramNotes
{
BOOL result = NO;
//paramCalendar = [self.eventStoreiReportShifts defaultCalendarForNewEvents];
if (self.eventsAccessGranted) {
NSArray *caledars = [self.eventStore calendarsForEntityType:EKEntityTypeEvent];
self.selectedCalendarEventKitIdentifier = [[NSUserDefaults standardUserDefaults] objectForKey:@"eventkit_cal_identifiers_string"];
for(EKCalendar *aCal in caledars){
if([aCal.calendarIdentifier isEqualToString:self.selectedCalendarEventKitIdentifier]){
paramCalendar = [self.eventStore calendarWithIdentifier:[[NSUserDefaults standardUserDefaults] objectForKey:@"eventkit_cal_identifiers_string"]];
}
}
for (EKSource *source in self.eventStore.sources) {
if (source.sourceType == EKSourceTypeCalDAV) {
paramCalendar.source = source;
break;
} else if(source.sourceType == EKSourceTypeLocal){
paramCalendar.source = source;
break;
}
}
}else{
return NO;
}
/* If a calendar does not allow modification of its contents
then we can not insert an event into it */
if (paramCalendar.allowsContentModifications == NO) {
NSLog (@ "\n\n The selected calendar does not allow modifications.");
return NO;
}
/* Create an event */
EKEvent * event = [EKEvent eventWithEventStore:paramStore];
event.calendar = paramCalendar;
/* Set the properties of the event such as its title,
start date / time, end date / time, etc. */
event.title = paramTitle;
event.notes = paramNotes;
event.startDate = paramStartDate;
event.endDate = paramEndDate;
/* Finally, save the event into the calendar */
NSError * saveError = nil;
result = [paramStore saveEvent:event
span:EKSpanThisEvent
error:&saveError];
if (result == NO) {
NSLog (@ "\n\n An error occurred = %@", saveError);
}
return result;
}
выше код дает следующую ошибку
CalendarCalculations[1668:45103]
Error getting shared calendar invitations for entity types 3 from
daemon: Error Domain=EKCADErrorDomain Code=1013
"The operation couldn’t be completed. (EKCADErrorDomain error 1013.)"
как я могу избавиться от него, пожалуйста?
Ответы
Ответ 1
У меня была такая же проблема в моем приложении. Я заметил, что ошибка возникает при вызове метода calendarWithIdentifier
.
EKCalendar *selectedCalendar = [self.eventStore calendarWithIdentifier:selectedCalendarIdentifier];
Я не знаю точно, почему это происходит, но я предполагаю, что это происходит, когда у вас нет общего календаря на вашем устройстве. Вот ссылка О общих календарях iCloud
Я нашел решение здесь, и я исправил его в своем приложении со следующим фрагментом кода:
EKCalendar *selectedCalendar = [EKCalendar calendarForEntityType:EKEntityTypeEvent eventStore:self.eventStore];
NSString *selectedCalendarIdentifier = [[NSUserDefaults standardUserDefaults] objectForKey:@"selectedCalendarIdentifier"];
//instead of getting calendar by identifier
//get all calendars and check matching in the cycle
NSArray *allCalendars = [self.eventStore calendarsForEntityType:EKEntityTypeEvent];
for (EKCalendar *calendar in allCalendars) {
if ([calendar.calendarIdentifier isEqualToString:selectedCalendarIdentifier]) {
selectedCalendar = calendar;
break;
}
}
Конечно, это не очень хороший способ, но ошибка исчезла.
Надеюсь, это поможет вам;)
Ответ 2
Другой причиной этой ошибки является использование битовой маски EKEntityMaskEvent
вместо типа EKEntityTypeEvent
для параметра типа сущности, создающего календарь.
Если вы попытаетесь создать календарь, например:
EKCalendar *calendar = [EKCalendar calendarForEntityType:EKEntityMaskEvent eventStore:self.eventStore];
Затем календарь корректно возвращается с идентификатором, но календарь кажется недействительным, и он не может быть сохранен, хотя ошибка не получается. Никакое событие не может быть добавлено к нему. И calendarWithIdentifier
возвращает nil.
Правильный синтаксис использует EKEntityTypeEvent
, например:
EKCalendar *calendar = [EKCalendar calendarForEntityType:EKEntityTypeEvent eventStore:self.eventStore];
Ответ 3
Старый вопрос, но для справки у меня возникла эта проблема, когда я переключился с работы с напоминаниями на события Calendar. Я забыл изменить тип сущности во всех местах.
В частности, я загружал статус моих прав для EKEntityType Напоминание с помощью
EKAuthorizationStatus authorizationStatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeReminder];
и последний запрашивает у пользователя разрешение для EKEntityType Событие с
[self.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (error == nil) {
// Store the returned granted value.
} else {
NSLog(@"%@", [error localizedDescription]);
}
}];
Итак, решение заключалось в изменении проверки статуса моих прав на это:
EKAuthorizationStatus authorizationStatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];