EKCalendar中的“完整日历同步”究竟是什么?

EKCalendar类的文档声明了calendarIdentifier属性:

与日历完全同步将失去此标识符。 您应该有一个处理日历的计划,该日历的标识符不能通过caching其他属性来获取。

什么时候发生“完全同步”,除了calendarIdentifier之外,哪些属性可能会发生变化?

什么时候发生“完全同步”?
日历和提醒编程指南以这种方式解释这个问题:

如果您的应用程序外部发生日历数据库更改,则“事件工具包”能够通过通知检测到更改,以便您的应用程序可以采取适当的行动。 使用Event Kit对日历项目所做的更改会自动同步到关联的日历(CalDAV,Exchange等)。

当您的应用程序处于打开状态时,我会看到“完全同步”事件的情况:
1.用户将您的应用程序发送到后台并打开日历应用程序 他更改日历名称,添加/编辑/删除事件,甚至删除一些日历。
2.用户将某些更改应用于Mac上的iCloud日历。 通知iOS设备iCloud日历已更改,因此必须进行同步。
3.第三方应用程序收到无声通知,iOS在后台启动,应用程序根据通知创build一些日历事件。

一般来说,这意味着“全同步”事件随时可能发生。

如何检测和处理“完全同步”事件?
观察日历数据库的外部变化以这种方式解释了这些问题:

其他进程或应用可能会在您的应用运行时修改日历数据库。 如果您的应用获取日历事件或提醒,则应该注册以通知有关日历数据库的更改 。 通过这样做,您可以确保显示给用户的日历和提醒信息是最新的。

以下是注册此类通知的代码示例:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(storeChanged:) name:EKEventStoreChangedNotification object:eventStore]; 

我觉得有必要重新创buildEKCalendar类的实例并重新cachingcalendarIdentifier

除了calendarIdentifier之外,哪些属性可能会更改?
我找不到任何关于这个问题的文档。 但是由于日历甚至可能在某个时刻不存在(例如用户在日历应用程序中手动删除它),那么发生“完全同步”事件后, EKCalendar对象的任何属性都可能无效。

另外,阅读上面的链接可以获得更多信息和细节。

完全同步发生在添加日历时。 所有添加的日历都caching在系统(iOS或MacOS)上,并获得唯一的ID。 这可以很容易地在MacOS上检查 – 如果你去目录~/Library/Calendars/你会看到一个目录列表,如:

 3CC21C9A-0B3C-4A76-B2B0-8D3643CF2992.exchange/ 45EF644F-672A-453A-ACC9-A565F017F766.calendar/ 

这是可以用calendarIdentifier检查的唯一ID。

为了testingiOS上的calendarIdentifier更改方式,您可以在名称为testcal iCloud中创build日历,并使用以下代码获取标识符:

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

之后,禁用日历(设置 – > iCloud – >日历,select“从我的iPhone删除”)并启用它。 当您再次执行代码时,您将看到不同的标识符,尽pipe日历是相同的。

另一种情况是,如果本地高速caching已损坏,则会执行完全同步。 在这种情况下,日历应该尝试重build它。

因此,通过标识符查找日历并不是一个好主意,您可以使用标题,types,颜色等来唯一标识它。

基于iTunes论坛,当它是完全同步没有指定,并取决于他们:

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

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

与易于更改的属性相关的是所有可以被其他线程访问的属性(与calendarIdentifier相同),因此是非primefaces的,可以更改的属性,这里是我可以find的:

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