Ответ 1
Когда происходит "полная синхронизация"?
Руководство по программированию календаря и напоминаний объясняет этот вопрос следующим образом:
Если изменение базы данных календаря происходит за пределами вашего приложения, Event Kit способен обнаруживать изменения путем уведомления, поэтому ваше приложение может действовать надлежащим образом. Изменения, внесенные в элементы календаря с помощью Event Kit, автоматически синхронизируется с соответствующим календарем (CalDAV, Exchange и так далее).
Я вижу такие сценарии событий "полной синхронизации", пока ваше приложение открыто:
1. Пользователь отправляет ваше приложение в фоновый режим и открывает приложение "Календарь". Он изменяет имя календаря, добавляет/редактирует/удаляет события или даже удаляет какой-либо календарь.
2. Пользователь применяет некоторые изменения к календарю iCloud на Mac. Устройство iOS уведомляется о том, что календарь iCloud был изменен, поэтому его нужно синхронизировать.
3. Стороннее приложение получает тихое уведомление, iOS запускает его в фоновом режиме, приложение создает какое-то событие календаря на основе уведомления.
В целом это означает, что событие "полная синхронизация" может произойти в любое время.
Как обнаружить и обработать событие "полная синхронизация"?
Наблюдение внешних изменений в базе данных календаря объясняет следующие вопросы следующим образом:
Возможно, для другого процесса или приложения изменить календарь в то время как ваше приложение работает. Если ваше приложение выбирает календарь события или напоминания, , вы должны зарегистрироваться, чтобы получать уведомления об изменениях. в базу данных календаря. Поступая таким образом, вы гарантируете, что календарь и информация напоминания, которую вы показываете пользователю, является текущей.
Вот пример кода для регистрации на такое уведомление:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(storeChanged:)
name:EKEventStoreChangedNotification
object:eventStore];
Я думаю, что имеет смысл воссоздать экземпляры классов EKCalendar
и recache calendarIdentifier
, если это необходимо.
Какие свойства могут изменяться помимо calendarIdentifier?
Я не могу найти документацию по этому вопросу. Но поскольку календарь может даже не существовать в какой-то момент (например, пользователь вручную удаляет его в приложении "Календарь" ), любое свойство объекта EKCalendar
может быть недействительным после возникновения события "полная синхронизация".
Также имеет смысл читать выше ссылки для получения дополнительной информации и подробностей.