Ошибка получения общих приглашений календаря для типов объектов 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.)"

пожалуйста, как я могу избавиться от него?


person user2511630    schedule 01.02.2015    source источник


Ответы (3)


У меня была такая же проблема в моем приложении. Я заметил, что ошибка возникает при вызове метода 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;
    }
}

Конечно, это не очень хороший способ, но ошибка исчезла. Надеюсь, это поможет вам ;)

person LembergSun    schedule 12.02.2015
comment
Хороший совет: это может произойти только при отсутствии общих календарей! - person ctietze; 17.04.2015
comment
Я получаю это время от времени на устройстве с кучей общих календарей, но использую Google, а не iCloud. похоже, это не влияет на функциональность, но делает отладку PITA, поскольку заполняет журнал дерьмом. - person Stefan Fisk; 06.05.2015
comment
Работает отлично. Большое спасибо :) - person Vaibhav Jhaveri; 21.07.2015

Другой причиной этой ошибки является использование битовой маски EKEntityMaskEvent вместо типа EKEntityTypeEvent для параметра типа объекта, создающего календарь.

Если вы попытаетесь создать календарь, например:

EKCalendar *calendar = [EKCalendar calendarForEntityType:EKEntityMaskEvent eventStore:self.eventStore];

Тогда календарь хорошо возвращается с идентификатором, но календарь кажется недействительным, и его нельзя сохранить, хотя ошибки не возникает. Никакое событие не может быть добавлено к нему. И calendarWithIdentifier возвращает ноль.

Правильный синтаксис использует EKEntityTypeEvent, например:

EKCalendar *calendar = [EKCalendar calendarForEntityType:EKEntityTypeEvent eventStore:self.eventStore];
person Lisarien    schedule 25.07.2015

Старый вопрос, но, для справки, у меня была эта проблема, когда я переключился с работы с напоминаниями на события календаря. Я забыл изменить тип объекта во всех местах.

В частности, я загружал статус своих разрешений для EKEntityTypeReminder с помощью

EKAuthorizationStatus authorizationStatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeReminder];

а последний запрашивает у пользователя разрешение на EKEntityTypeEvent с помощью

[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];
person Rodrigo Pinto    schedule 16.11.2015