EKCADErrorDomain с использованием calendarWithIdentifier

В моем приложении iOS я использовал для доступа к календарю следующий метод:

EKCalendar* cal = [eventStore calendarWithIdentifier:[calendarIDs objectAtIndex:i]];

разрешения запрашиваются у пользователя через:

eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted,NSError* error){}

теперь это отлично работает на iOS 7, но на iOS 8 я продолжаю получать следующую ошибку каждый раз, когда вызывается метод calendarWithIdentfier:

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 whtman    schedule 22.09.2014    source источник


Ответы (2)


Я тоже в тупике на той же глупости.

Я просто перебрал массив календарей и сопоставил их по идентификатору. Это не элегантно, но работает, и у среднего пользователя, вероятно, меньше 10 календарей, так что... ну ладно..

вот мой обходной путь в быстром

func createEvent(){
    var event = EKEvent(eventStore: self.eventStore)
    var calendar : EKCalendar!
    let calendars : [EKCalendar] = self.eventStore.calendarsForEntityType(EKEntityTypeEvent) as [EKCalendar]

    for aCal in calendars
    {
        if(aCal.calendarIdentifier == self.calendarIdentifier)
        {
            calendar = aCal
            break
        }
    } ...continue to do stuff to events....

}
person iamdavidlam    schedule 22.09.2014
comment
У меня та же проблема, описанная в вопросе, но я не получил вашего ответа. Можете ли вы объяснить, почему появляется это сообщение об ошибке? - person Frank Martin; 24.09.2014
comment
Я понятия не имею, почему отображается сообщение об ошибке. Надеюсь, меня тоже просветят. Но я знаю, что мое решение сработало в моем случае, и, надеюсь, оно сработает и в вашем :) - person iamdavidlam; 25.09.2014
comment
я использовал ваш обходной путь и сработал, ошибки больше нет :) я отмечаю ваш ответ как правильный, надеюсь, однажды мы поймем, почему возникает исключение - person whtman; 26.09.2014
comment
@whtman: Не могли бы вы поделиться, как вы изменили свой код (до/после)? - person Frank Martin; 27.09.2014
comment
Привет, Фрэнк, метод: [eventStore calendarWithIdentifier: someIdentifier] является виновником того, что мой фрагмент кода в основном идентифицирует календарь по его идентификатору «вручную», а не использует готовое решение :) - person iamdavidlam; 29.09.2014
comment
@iamdavidlam: Большое спасибо за объяснение. Теперь я понимаю, что вы делаете, и смог исправить свой код! :-) - person Frank Martin; 29.09.2014
comment
Вместо циклического перебора calendarIdentifiers: for (NSString *storeCalID in storeCalIDs) { EKCalendar *aCal = [store calendarWithIdentifier:storeCalID]; [storeCals addObject:aCal]; } фиксированный код зацикливается на CalendarIdentifiers: for (EKCalendar *aCal in [store calendarsForEntityType:EKEntityTypeEvent]) { if ([storeCalIDs containsObject:aCal.calendarIdentifier]) { [storeCals addObject:aCal]; } } - person Frank Martin; 29.09.2014
comment
Спасибо, меня это тоже озадачило. Более лаконичный способ записи: let allCalendars : [EKCalendar] = self.eventStore.calendarsForEntityType(EKEntityTypeEvent) as [EKCalendar] `\` let calendars = allCalendars.filter { $0.calendarIdentifier == self.calendarIdentifier } - person Brad G.; 17.10.2014

Свифт 4.2

Вместо

let matchedCal = eventStore
    .calendar(withIdentifier: calendarIdentifier)

Вы можете использовать:

let matchedCal = eventStore
    .calendars(for: .event)
    .first(where: { $0.calendarIdentifier == calendarIdentifier })
person Aaron Brager    schedule 30.09.2018