Случайные проблемы синхронизации EKEventStore с календарем Google

Я потратил часы, чтобы отследить эту ошибку.

Мое приложение должно удалить некоторые события, а затем добавить некоторые другие события. Это отлично работает с iCloud и локальными календарями. Однако с календарями Google это меняется.

Что я заметил до сих пор:

  • Иногда все работает идеально. Все события, которые должны быть удалены, удаляются, а все события, которые должны быть добавлены, добавляются.
  • Иногда поначалу вроде все нормально синхронизируется, но через 2 минуты события удаляются.
  • .remove работает лучше (95%), чем .save (50-80%).
  • ошибок захвата нет. Ни для .remove, ни для .save.

Кажется (?!), что календари Google с небольшим количеством событий (внутри или вне предиката - не имеет значения) синхронизируются правильно. Календари Google со многими событиями (внутри или вне предиката) вызывают упомянутые проблемы синхронизации.

Вот выдержки из кода (на самом деле ничего особенного!):

let evenStore = EventStore()
let predicate = eventStore.predicateForEvents(withStart: predicateStartDate!,
                                              end: predicateEndDate!,
                                              calendars: selectedCalendarArray)
let events = eventStore.events(matching: predicate)
for event in events {
    do {
        try eventStore.remove(event, span: .thisEvent, commit: false)
    } catch {
        print("event remove catch error")
    }
}

... (новые события создаются и сохраняются в eventsSave)

for event in eventsSave {
    do {
        try eventStore.save(event, span: .thisEvent, commit: false)
    } catch {
        print("event save catch error")
    }
}

do {
    try eventStore.commit()
} catch {
    print("commit catch error")
}

Я пытался избежать партии .remove или .save (true i.s.o. false - нет commit()), безуспешно.
Я добавил eventStore.reset(). Безуспешно.
Я добавил eventStore.refreshSourcesIfNecesary(). Нет успеха.

Чего я действительно не понимаю, так это того, что iCloud работает на 100%. Календарь Google также является облачным календарем. Что заставляет его вести себя так по-другому? На SO есть несколько сообщений, но в основном они относятся к 2013-2016 годам. После этого уже практически ничего. Также никогда не бывает надежного решения, в лучшем случае некоторые обходные пути. >Отсутствует EKEvents при сохранении нескольких событий календаря Google
Пакетное сохранение событий EKEevents в календаре Google, что приводит к потере случайных событий

У меня сложилось впечатление, что чего-то простого и очень простого просто не хватает, но я понятия не имею, что это может быть...

Любая помощь приветствуется!

*** ОБНОВЛЕНИЕ (06.08.2020) ***

Некоторые события имеют геолокацию с помощью свойства X-APPLE-STRUCTURED-LOCATION. Эти события набрасываются на .save.

Error Domain=EKErrorDomain Code=19 "Locations with geo information are not supported by this account." UserInfo={NSLocalizedDescription=Locations with geo information are not supported by this account.}

Может ли эта ошибка быть связана с проблемой синхронизации темы?


person geohei    schedule 05.08.2020    source источник


Ответы (1)


Я считаю, что нашел решение.

Я использую средство выбора календаря, чтобы выбрать календарь. Я храню календарь по умолчанию в myStoredCalendar (строка), который должен быть предварительно выбран при представлении средства выбора календаря.

let selectedCalendar = myStoredCalendar
if let selectedCalendarIdentifier = eventStore.calendar(withIdentifier: selectedCalendar) {
    calendarChooser.selectedCalendars = Set<EKCalendar>([selectedCalendarIdentifier])
}

Выше работает, но генерирует следующее сообщение журнала (кроме проблем с событиями Google):

Error getting shared calendar invitations for entity types 3 from daemon: Error Domain=EKCADErrorDomain Code=1014"(null)

Следующий код больше не выдает ошибку 1014, и все проблемы с событиями Google исчезли.

let selectedCalendar = myStoredCalendar
    let calendars = eventStore.calendars(for: .event)
    for calendar in calendars {
        if calendar.calendarIdentifier == selectedCalendar {
            calendarChooser.selectedCalendars = Set<EKCalendar>([calendar])
        }
    }
}
person geohei    schedule 06.08.2021