Подтвердить что ты не робот

Что именно представляет собой "полную синхронизацию календаря" в EKCalendar?

В документации для класса EKCalendar указано это свойство calendarIdentifier:

Полная синхронизация с календарем потеряет этот идентификатор. Вам следует иметь план работы с календарем, идентификатор которого отсутствует более длинный выбор, способный кэшировать другие его свойства.

Когда происходит "полная синхронизация" и какие свойства могут изменяться помимо calendarIdentifier?

4b9b3361

Ответ 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 может быть недействительным после возникновения события "полная синхронизация".

Также имеет смысл читать выше ссылки для получения дополнительной информации и подробностей.

Ответ 2

Полная синхронизация происходит при добавлении календаря. Все добавленные календари кэшируются в системе (iOS или MacOS) и получают уникальный идентификатор. Это можно легко проверить на MacOS - если вы перейдете в каталог ~/Library/Calendars/, вы увидите список с такими каталогами, как:

3CC21C9A-0B3C-4A76-B2B0-8D3643CF2992.exchange/

45EF644F-672A-453A-ACC9-A565F017F766.calendar/

которые являются уникальными идентификаторами, которые можно проверить с помощью calendarIdentifier.

Чтобы проверить, как изменения calendarIdentifier в iOS, вы можете создать календарь в iCloud с именем testcal и использовать следующий код для получения идентификатора:

EKEventStore *eventStore = [[EKEventStore alloc] init];
NSArray *cal = [eventStore calendarsForEntityType:EKEntityTypeEvent];
for (EKCalendar *i in cal) {
    if([i.title isEqualToString:@"testcal"]) {
        NSLog(@"%@", i.calendarIdentifier);
    }
}

После этого отключите календарь (Настройки → iCloud → Календари, выберите "Удалить из моего iPhone" ) и включите его. Когда вы снова запустите код, вы увидите другой идентификатор, хотя календарь тот же.

Другой случай, когда я вижу, что будет выполняться полная синхронизация, - это повреждение локального кеша. В этом случае календарь должен попытаться перестроить его.

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

Ответ 3

На основе форума iTunes, когда он полностью синхронизирован, не определяется и зависит от них:

http://www.openradar.appspot.com/15671424

https://idmsa.apple.com/IDMSWebAuth/login?appIdKey=4a75046cda87eab6386a9eae8caabb9824e328b9abc988119b39296495ec184c&path=/login.jspa#926856.

В отношении свойств, которые могут быть изменены, все они могут быть доступны другими потоками (такими же, как calendarIdentifier), следовательно, те, которые неатомны и могут быть изменены, вот те, которые я мог найти:

allowsContentModifications, CGColor, immutable,title,type,allowedEntityTypes,source,subscribed,supportedEventAvailabilities