究竟是什么构成了EKCalendar一个“完整的日历同步”?(What exactly consti

2019-08-21 01:44发布

对于文档EKCalendar类状态本作的calendarIdentifier属性:

与日历完全同步将失去这个标识符。 你应该有一个处理一个日历,其标识不再提取,能够通过缓存它的其他属性的计划。

当究竟会出现一个“完全同步”,什么性质容易除了改变calendarIdentifier

Answer 1:

究竟什么时候是“完全同步”出现?
日历和提醒编程指南解释了这样这个问题:

如果您的应用程序之外发生了变化,以日历数据库,事件套件能够通过通知检测改变让你的应用程序可以采取适当的行动。 日历项进行的与事件套件更改会自动同步到相关联的日历(CalDAV的,交易所等)。

我看到的“完全同步”事件这样的情况下,而你的应用程序是开放的:
1.用户发送您的应用程序的背景,并打开日历应用。 他改变日历的名称,添加/修改/删除的事件,甚至删除某些日历。
2.用户应用一些更改Mac上的iCloud日历。 iOS装置被通知改变的iCloud日历所以它必须被同步。
3.第三方应用程序接收通知沉默,iOS设备推出它的背景下,应用程序创建一个基于通知一些日历事件。

一般而言则表示“完全同步”事件可以发生在任何时间。

如何检测和处理“完全同步”事件?
观测外部更改日历数据库解释这样这个问题:

这是可能的另一个进程或应用你的应用程序运行时修改日历数据库。 如果您的应用程序读取日历事件或提醒, 要注册到被通知更改日历数据库。 通过这样做,可以确保您显示给用户的日历和提醒信息是最新的。

下面是用于登记到这样的通知的代码示例:

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

我觉得很有道理重建的实例EKCalendar类和缓存, calendarIdentifier如果需要的话。

什么样的属性容易除了calendarIdentifier改变?
我无法找到有关这个问题的任何文件。 但由于日历甚至没有在某一时刻存在(例如用户手动删除它在日历应用),那么任何财产EKCalendar对象可以是后“完全同步”事件发生无效。

此外,它是有意义的阅读以了解更多信息和细节上面的链接。



Answer 2:

当添加日历完全同步发生。 所有添加的日历缓存系统(iOS或MacOS的)上,并接收一个唯一的ID。 这可以很容易地检查在MacOS -如果你去到目录~/Library/Calendars/你会看到类似目录的列表:

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

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

这是可以与被检查的唯一ID 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删除”),并启用它。 当您再次执行代码,你会看到一个不同的标识符,虽然日历是一样的。

在那里我看到将要执行的完全同步是如果本地缓存损坏另一种情况。 在这种情况下,日历应尽量重建。

因此,它是没有找到它的标识日历是一个好主意,你可以使用名称,类型,颜色等,以唯一标识。



Answer 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


文章来源: What exactly constitutes a “full calendar sync” in EKCalendar?