Swift 或 Objective C 中的 CalDAV 处理

CalDAV handling in Swift or Objective C

我正在尝试使用 EventKit 或第三方库来操纵 CalDAV 事件。 我在我的本地网络中托管了一个 CalDAV 服务器,我在 VEVENT 的资源 属性 中添加了一些额外的 属性 参数,它看起来像:

BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
CREATED:20160108T144516Z
UID:9ED5366B-E3BD-4C32-BA67-4B9A1F5D39F7
DTEND:20160224T093000
TRANSP:OPAQUE
RESOURCES;X-ORE-IPP=%14119%;X-ORE-RES=%3%;X-ORE-STATUT=%103%;X-ORE-TYPE=
 %3%:
SUMMARY:summary test
DTSTART:20160224T090000
DTSTAMP:20160224T075721Z
LAST-MODIFIED:20160224T075721Z
SEQUENCE:0
DESCRIPTION:EII 25 27 lioei
 anto)
END:VEVENT
END:VCALENDAR

使用 EventKit 我们可以操纵事件的一些属性,但是我们如何访问自定义 属性 参数??

当前 EventKit 提供的 API 非常有限,无法让您访问自定义属性或自定义 属性 参数。 (但是它应该保留自定义参数 - 尽管 RESOURCES 可能有特殊行为)。

简而言之:EventKit 做不到你想要的。您要么需要 implement CalDAV on your own or use a 3rd party library - CalConnect maintains a list.

P.S.:

另外,我觉得您对 RESOURCES 的(滥用)使用不太合适。首先 - 它似乎没有价值。这可能会使客户感到困惑(他们可能会放弃它 - 因为,好吧,它没有指定任何资源。

然后 RESOURCES 是一个非常简单的 但多值 属性,例如来自 RFC:

RESOURCES:EASEL,PROJECTOR,VCR

您的用法似乎表明您的自定义 属性 参数属于单个资源(状态等)。在 iCalendar 中,这种调度通常不是通过资源 属性 完成的,而是通过 ATTENDEE property and a CUTYPE RESOURCE 完成的,例如:

ATTENDEE;CUTYPE=ROOM;STATUS=ACCEPTED:ore://localhost/rooms/28372
ATTENDEE;CUTYPE=RESOURCE:STATUS=TENTATIVE:ore://localhost/beamers/8347

我不知道您的实际 'ORE' 用例是什么。如果它与 CalDAV 兼容(我想这应该是可取的),您可以使用 ATTENDEE。如果不是,最好使用自定义 属性 而不是自定义 属性 参数,例如:

X-ORE-RESOURCE;STATUS=ACCEPTED:ore://localhost/rooms/28372

请注意,您可能希望在该自定义 属性 上使用标准 属性 参数(例如,STATUS 而不是 X-ORE-STATUS)。

P.S.2:您的VCALENDAR使用浮动时间。这在技术上是有效的,但很少有客户支持。客户通常对全天事件使用浮动日期,但对有时间的事件使用 UTC 或 TZ 时间。他们可能会阅读它,但如果他们编辑事件,则会附上他们当地的时区。从而使事件不浮动。不确定这对您是否重要,但很可能附上 TZID 是个好主意。

P.S.3:您的 VCALENDAR 缺少 PRODID。