如何在 iOS 上使用 EventKit 跨多个设备同步事件

Ile*_*ian 5 icalendar synchronization objective-c ios eventkit

假设我必须编写一个应用程序,该应用程序必须与设备上可用的日历之一同步。假设我有“Action”对象,它们有开始日期、结束日期、重复发生等。

设备 A:我创建了“Action”对象,然后使用 EventKit 将它们与名为“Foo”的 iCloud 日历同步。我得到了一些唯一标识符,我必须将它们与我的“Action”对象链接起来,以便知道将来要更新/删除哪个。然后我将我的“Action”对象与我自己的服务器同步。

设备 B:我从服务器获取“Action”对象。我修改它们。我必须更新日历项目。如果我没有在设备 B 上设置“Foo”日历会怎样?如果我拥有它会怎样?

我想我需要使用属性calendarItemExternalIdentifier而不是calendarItemIdentifier属性,以便在使用相同日历的设备之间唯一标识事件,对吗?

这是calendarItemExternalIdentifier在创建 calendarItem 的那一刻给出的吗?还是由 iCloud 服务器提供?我需要互联网连接才能工作吗?

calendarIdentifier物业的文件说明:

与日历完全同步将丢失此标识符。您应该制定一个计划来处理一个日历,该日历的标识符不再能够通过缓存其他属性来获取。

完全同步甚至意味着什么?

ale*_*x-i 2

calendarItemExternalIdentifier一旦您保存(通过提交)日历项目即可使用。但是,在某些情况下,当日历项目进一步同步到服务器时(例如,如果它是来自 Exchange 帐户的事件), calendarItemExternalIdentifier 稍后会发生更改。

所有其他标识符不在设备之间共享(这包括源和日历的标识符),因此最好的选择是坚持使用calendarItemExternalIdentifier.

当用户设置新源(例如,用户删除并添加相同的 Exchange 帐户)时,可能会发生与日历的完全同步。还可能存在导致完整日历同步的不同情况。
calendarIdentifier是一个本地标识符,因此它在您的情况下没有多大用处(除非您想为更改问题创建解决方法calendarItemExternalIdentifier)。

如前所述,日历和源标识符不是全局的,因此几乎不可能知道“Foo”日历是否在不同的设备上设置,或者“Foo”日历是否与其他设备上的“Foo”日历相同。设备。
通常,如果您在新设备上找到 Action 对象,则可以假设它所属的日历与不同设备上的日历相同。

更新 Action 对象时,解决此问题的一种方法是将更改(像往常一样)保存到服务器。然后,每台设备(包括进行更改的设备)都会搜索相应的日历项目,如果找到则更新它。
我目前正在做类似的事情,这可能就是我最终要做的事情。

更好的替代方案(可能也更耗时)是让服务器与外部源(CalDav、Exchange 等)连接并同步。