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

假设我必须编写一个必须与设备上可用的日历同步的应用程序.让我们假设我有“动作”对象,它们有开始日期,结束日期,重复等.

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

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

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

是在创建calendarItem的那一刻给出的calendarItemExternalIdentifier吗?或者它是由iCloud服务器提供的?我需要互联网连接吗?

calendarIdentifier属性的文档说明:

A full sync with the calendar will lose this identifier. You should
have a plan for dealing with a calendar whose identifier is no longer
fetch-able by caching its other properties.

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

最佳答案 只要您保存(使用提交)日历项目,calendarItemExternalIdentifier就可用.但是,有些情况下calendarItemExternalIdentifier
is later changed,当日历项进一步同步到服务器时(例如,如果它是来自Exchange帐户的事件).

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

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

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

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

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

点赞