【问题标题】:iCalendar creation: RFC 5546 explanationiCalendar 创建:RFC 5546 解释
【发布时间】:2013-05-10 03:44:40
【问题描述】:

我面临与创建必须与多个客户端兼容的 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 文件将更多事件添加到我提到的平台的用户日历中?

用于 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

请求样本:

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

【问题讨论】:

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


    【解决方案1】:

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

    关于 2) 是的,您可以在 PUBLISH 流中包含多个事件

    大约3):

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

    因此,REQUEST 只能用于传输单个事件(只有一个 UID),但该事件本身可能表示为一组 VEVENT:一个用于 master(例如,每个星期五 10:00 开会)每个例外情况(例如,12 年 12 月 12 日星期五 09:00 除外)。

    例如查看https://www.rfc-editor.org/rfc/rfc5546#section-4.4.8中的最后一个事件

    【讨论】:

    • 我更新了第 1 点的问题),无论如何我是通过邮件发送日历,无论是作为附件还是嵌入正文并不重要。关于第 2 点),这是否意味着像 Google Calendar 或 Lightning 之类的客户端存在缺陷或不完整?那么显然没有办法为多个客户发送一个文件,对吗?
    • 你是对的,他们的行为不正确。我怀疑他们对待 PUBLISH 的方式与 REQUEST 相同,因此只允许一个事件(可选 VEVENT 例外),尽管从 4 开始),看起来 gmail 正在做的事情与它应该做的完全相反。跨度>
    • 我错了 4。我终于采取了更科学的方法,我正在准备一份文档,描述事件数量、客户端、UID 和方法的某些组合的行为。 Google 日历仅添加第一个事件。
    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2012-10-14
    • 1970-01-01
    • 2011-09-23
    • 2011-03-22
    • 2012-10-11
    相关资源
    最近更新 更多