iCalendar创建:RFC 5546解释

时间:2013-05-15 14:05:48

标签: ios5 outlook google-calendar-api icalendar lightning

我面临与创建ICS文件相关的几个问题,该文件必须与多个客户端兼容,尤其是iOSGmailOutlookAndroidWindows Phone。谷歌搜索,我发现了2009年提出的标准,即RFC5546。我仔细阅读了这篇文章,发现了一个非常有趣的观点,可以解决我的问题。第Methods for VEVENT Calendar Components节解释了方法REQUEST和PUBLISH之间的区别。但是,有几点我不太清楚:

  1. PUBLISH应该做什么?它应该添加新日历吗?它应该创建一个新日历(如在Outlook或iOS中)还是应该在现有用户日历中添加事件(如在Gmail或Lightning中)? 编辑:将日历记录为附加到电子邮件的文件。
  2. PUBLISH可以包含多个事件吗?从文档和逻辑上,是的,但Gmail然后只添加列表的第一个事件。 Lightning只添加一个事件,然后发出804a0004错误。
  3. REQUEST应如何运作?该文档指出:VEVENT | 1+ | All components MUST have the same UID.表示日历可能具有多于1个VEVENT,但它们必须具有相同的UID。然后,我如何区分这些事件?事实上,我尝试的客户端无法区分使用相同UID生成的事件,但它们只添加了SEQUENCE最高的事件。从逻辑上讲,我不希望每个邀请发送多个事件,但RFC允许我这样做(在我想要的案例研究中),那么如何?
  4. 使用REQUEST,忘记语句VEVENT | 1+ | All components MUST have the same UID.,因此为ICS文件中的每个事件提供唯一的UID,Gmail和iOS会添加文件中包含的所有事件,而Lightning和Outlook仅添加第一个事件。有没有办法追求这条道路,或者因为不应该允许我找到另一种方式?
  5. 基本上,您如何建议继续使用单个ICS文件将更多事件添加到我提到的平台的用户日历中?
  6. PUBLISH的样本ICS:

    BEGIN:VCALENDAR
    PRODID:-//prodid//product//IT
    VERSION:2.0
    METHOD:PUBLISH
    CALSCALE:GREGORIAN
    BEGIN:VEVENT
    UID:uid1
    DTSTAMP:20130515T121437Z
    DTSTART:20130619T205000
    DTEND:20130619T215000
    DESCRIPTION:Desc 1
    SUMMARY:Sum 1
    LOCATION:location
    ORGANIZER:mailto:organizer@somedomain
    SEQUENCE:1
    STATUS:CONFIRMED
    END:VEVENT
    BEGIN:VEVENT
    UID:uid2
    DTSTAMP:20130515T121437Z
    DTSTART:20130719T205000
    DTEND:20130719T215000
    DESCRIPTION:Desc 2
    SUMMARY:Sum 2
    LOCATION:location
    ORGANIZER:mailto:organizer@somedomain
    SEQUENCE:1
    STATUS:CONFIRMED
    END:VEVENT
    END:VCALENDAR
    

    REQUEST的样本:

    BEGIN:VCALENDAR
    PRODID:-//prodid//product//IT
    VERSION:2.0
    METHOD:REQUEST
    CALSCALE:GREGORIAN
    BEGIN:VEVENT
    UID:uid1
    DTSTAMP:20130515T121437Z
    DTSTART:20130619T205000
    DTEND:20130619T215000
    DESCRIPTION:Desc 1
    SUMMARY:Sum 1
    LOCATION:location
    ORGANIZER:mailto:organizer@somedomain
    ATTENDEE;RSVP=TRUE;CN=attendee cn:mailto:attendee@email
    SEQUENCE:1
    STATUS:CONFIRMED
    END:VEVENT
    BEGIN:VEVENT
    UID:uid2
    DTSTAMP:20130515T121437Z
    DTSTART:20130719T205000
    DTEND:20130719T215000
    DESCRIPTION:Desc 2
    SUMMARY:Sum 2
    LOCATION:location
    ORGANIZER:mailto:organizer@somedomain
    ATTENDEE;RSVP=TRUE;CN=attendee cn:mailto:attendee@email
    SEQUENCE:1
    STATUS:CONFIRMED
    END:VEVENT
    END:VCALENDAR
    

1 个答案:

答案 0 :(得分:1)

关于1)目前尚不清楚如何将事件传达给客户:是通过iMIP(电子邮件)还是通过HTTP URL?在任何情况下,您的问题都没有正确的答案:iTIP是关于iCalendar数据的传输。

关于2)是的,你可以在PUBLISH流中有多个事件

关于3):

iCalendar对定期会议有一个例外概念。这些异常由具有相同UID的VEVENT和表示将被视为异常的特定实例的RECURRENCE-ID表示。

因此,REQUEST只能用于传输单个事件(只有一个UID),但此事件本身可能表示为一组VEVENT:一个用于主控(例如每周五10:00开会)每个例外一个(例如,除了12月12日星期五,它将在09:00进行)。

例如,请参阅http://tools.ietf.org/html/rfc5546#section-4.4.8

中的最后一个事件