EKCalendar
该类的文档为该calendarIdentifier
属性说明了这一点:
与日历完全同步将丢失此标识符。你应该有一个计划来处理一个日历,它的标识符不再可以通过缓存它的其他属性来获取。
究竟什么时候会发生“完全同步”,除了calendarIdentifier
?
EKCalendar
该类的文档为该calendarIdentifier
属性说明了这一点:
与日历完全同步将丢失此标识符。你应该有一个计划来处理一个日历,它的标识符不再可以通过缓存它的其他属性来获取。
究竟什么时候会发生“完全同步”,除了calendarIdentifier
?
究竟什么时候会发生“完全同步”?
Calendar and Reminders Programming Guide以这种方式解释了这个问题:
如果从您的应用程序外部发生对日历数据库的更改,Event Kit 能够通过通知检测更改,以便您的应用程序可以适当地采取行动。使用 Event Kit 对日历项目所做的更改会 自动同步到关联的日历(CalDAV、Exchange 等)。
我在您的应用打开时看到“完全同步”事件的此类场景:
1.用户将您的应用发送到后台并打开日历应用。他更改日历名称,添加/编辑/删除事件,甚至删除一些日历。
2.用户对 Mac 上的 iCloud 日历应用了一些更改。iOS 设备收到 iCloud 日历已更改的通知,因此必须进行同步。
3.第三方应用收到静默通知,iOS在后台启动,应用根据通知创建一些日历事件。
一般来说,这意味着“完全同步”事件可以随时发生。
如何检测和处理“完全同步”事件?
观察日历数据库的外部变化以这种方式解释了这个问题:
在您的应用程序运行时,其他进程或应用程序可能会修改日历数据库。如果您的应用程序获取日历事件或提醒,您应该注册以收到有关 日历数据库更改的通知。通过这样做,您可以确保向用户显示的日历和提醒信息是最新的。
以下是注册此类通知的代码示例:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(storeChanged:)
name:EKEventStoreChangedNotification
object:eventStore];
我认为重新创建类的实例并在需要 时重新EKCalendar
缓存是有意义的。calendarIdentifier
除了 calendarIdentifier 之外,哪些属性可能会发生变化?
我找不到有关此问题的任何文档。但是由于日历在某些时候甚至可能不存在(例如用户在日历应用程序中手动删除它),因此EKCalendar
在“完全同步”事件发生后对象的任何属性都可能无效。
此外,阅读上面的链接以获取更多信息和详细信息也很有意义。
添加日历时会发生完全同步。所有添加的日历都缓存在系统(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 删除”)并启用它。当您再次执行代码时,您将看到不同的标识符,尽管日历是相同的。
我看到将执行完全同步的另一种情况是本地缓存已损坏。在这种情况下,日历应该尝试重建它。
因此,通过标识符查找日历并不是一个好主意,您可以使用标题、类型、颜色等来唯一标识它。
基于 iTunes 论坛,未指定何时完全同步并取决于它们:
http://www.openradar.appspot.com/15671424
与可能更改的属性相关的是所有可以被其他线程访问的属性,(与 相同calendarIdentifier
)因此是非原子的并且可以更改的属性,这里是我能找到的那些:
allowsContentModifications, CGColor, immutable,title,type,allowedEntityTypes,source,subscribed,supportedEventAvailabilities