我正在尝试使用EventKit或第三方库来处理CalDAV事件。
我在本地网络中托管了一个CalDAV服务器,并且在VEVENT的RESOURCES属性中添加了一些额外的属性参数,如下所示:

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非常有限,并且无法让您访问自定义属性或自定义属性参数。 (但是,它应该保留自定义参数-尽管资源可能具有特殊的行为)。

简而言之:EventKit无法实现您想要的一切。您将需要implement CalDAV on your own或使用第三方库-CalConnect维护list

附言:

同样,您(滥用)资源的使用对我来说似乎不太正确。首先-它似乎没有价值。这可能会使客户端感到困惑(他们可能只是删除了它-因为,好吧,它没有指定任何资源。

那么RESOURCES是一个非常普通但是多值的属性,例如从RFC:

RESOURCES:EASEL,PROJECTOR,VCR


您的用法似乎表明您的自定义属性参数属于单个资源(状态等)。在iCalendar中,此类调度通常不使用RESOURCES属性,而是使用ATTENDEE属性和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。

10-06 11:11