12

阅读 Apple 的文档,我仍然对EKCalenderItem 的 calendarItemExternalIdentifierEKEvent 的 eventIdentifier之间的区别以及我们应该使用哪一个来识别不同设备上的日历事件感到困惑。具体来说:

EKCalendarItem calendarItemExternalIdentifier 日历服务器提供的日历项目的外部标识符。(只读)

EKEvent eventIdentifier:事件的唯一标识符。(只读)

EKCalendarItem calendarItemExternalIdentifier 是在 iOS6 中添加的,我原以为这将是我需要保存以便稍后调用的标识符,EKEventStore eventWithIdenfier:因为它声称:

此标识符允许您跨多个设备访问相同的事件或提醒。

但在我自己的测试中,似乎当我创建并保存一个新的 EKEvent 时,我从 EKEvent 对象中获得的 eventIdenifier 是唯一且有用的,而我获得的 calendarItemExternalIdentifier 似乎无法使用EKEventStore eventWithIdenfier:

如果有人有确凿的答案,我很想知道。

4

2 回答 2

8

calendarItemExternalIdentifier是事件的RFC 5545全局唯一标识符。它并不特定于 EKEventStore,实际上它代表了跨设备(以及跨非 iOS 客户端)的事件。如果您要从收件箱打开 .ics 附件,该值将显示在邀请的UID字段中。

也就是说,您不能根据此标识符直接查找 EKEventStore 事件。相反,您需要在事件存储上进行谓词搜索并检查每个事件的calendarItemExternalIdentifier

于 2014-04-30T23:38:09.560 回答
3

calendarItemExternalIdentifier可以用

func calendarItemsWithExternalIdentifier(externalIdentifier: String) -> [EKCalendarItem]

尽管 iOS 6.0 标记了可用性,但它可能直到最近才被记录(甚至是私有 api)。有趣的是,您可以取回多个项目,因此应该可以获取所有重复事件的发生(尚未测试)

此外,calendarItemExternalIdentifier的文档似乎也已更新,只是为了完整起见,这里是:

此标识符允许您跨多个设备访问相同的事件或提醒。在某些情况下,同一数据库中可能存在日历项目的重复副本:

日历项目从 ICS 文件导入到多个日历

在与用户共享的日历中创建了一个事件,并且该用户也被邀请参加该事件

用户是也有此事件的日历的代表

订阅的日历已添加到多个帐户

在这种情况下,您应该根据其他因素(例如日历或来源)在日历项之间进行选择。

重复事件标识符对于所有事件都是相同的。如果您希望区分事件,您可能需要使用开始日期。

对于 Exchange 服务器,标识符在 iOS 和 OS X 之间不同,在设备之间用于提醒也不同。

于 2015-08-13T08:35:55.190 回答