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

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

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

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


person user1869469    schedule 09.04.2013    source источник
comment
здесь вы можете найти некоторые пояснения. oleb.net/blog/2012/05/creating -и-удаление-календарей-в-ios   -  person Ilan    schedule 24.08.2013
comment
Это относится к синхронизации локального календаря с календарем CalDAV или iCloud. Когда это происходит, локальный календарь больше нельзя получить с помощью calendarWithIdentifier. Итак, если вы кэшировали calendarIdentifier, это не будет иметь никакого смысла. Вы должны либо получить доступ к календарю iCloud или, как предлагает документация, кэшировать значения тех свойств календаря, которые вы хотите использовать позже.   -  person Hadi Brais    schedule 24.07.2015


Ответы (3)


Когда именно происходит "полная синхронизация"?
Руководство по программированию календаря и напоминаний объясняет эти вопросы следующим образом:

Если изменение в базе данных календаря происходит из-за пределов вашего приложения, 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 и перекэшировать calendarIdentifier, если это необходимо.

Какие свойства могут измениться, кроме calendarIdentifier?
Я не могу найти никакой документации по этому вопросу. Но поскольку календарь может даже не существовать в какой-то момент (например, пользователь вручную удаляет его в приложении «Календарь»), любое свойство объекта EKCalendar может быть недействительным после того, как произойдет событие «полная синхронизация».

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

person Vlad Papko    schedule 25.07.2015

Полная синхронизация происходит при добавлении календаря. Все добавленные календари кэшируются в системе (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») и включите его. При повторном выполнении кода вы увидите другой идентификатор, хотя календарь тот же.

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

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

person VolenD    schedule 25.07.2015

Судя по форуму iTunes, при полной синхронизации не указано и зависит от них:

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

inWebMSA.apple. appIdKey=4a75046cda87eab6386a9eae8caabb9824e328b9abc988119b39296495ec184c&path=/login.jspa#926856.

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

allowsContentModifications, CGColor, immutable,title,type,allowedEntityTypes,source,subscribed,supportedEventAvailabilities
person juanmajmjr    schedule 24.07.2015