iCalendar创建:RFC 5546解释

3
我面临创建ICS文件的几个问题,该文件必须与多个客户端兼容,特别是iOS、Gmail、Outlook、Android和Windows Phone。在搜索时,我发现了2009年提出的建议标准,也就是RFC5546。我阅读了这个文档,并找到了一个非常有趣的点,可能可以解决我的问题。RFC5546VEVENT日历组件的方法节解释了REQUEST和PUBLISH方法之间的区别。但是,有几个点对我来说并不是很清楚:
  1. 发布应该做什么?它应该添加一个新日历吗?它应该创建一个新日历(类似于Outlook或iOS),还是将事件添加到现有的用户日历中(类似于Gmail或Lightning)?编辑:请注意,日历作为附加到电子邮件的文件。
  2. 发布可以包含多个事件吗?根据文档和逻辑,是的,但Gmail仅添加列表中的第一个事件。 Lightning仅添加一个事件,然后显示804a0004错误。
  3. 请求应该如何工作?文档说明:VEVENT | 1+ | 所有组件必须具有相同的UID。这意味着日历可能会有多个VEVENT,但它们必须具有相同的UID。那么,客户端如何区分这些事件?实际上,我尝试过的任何客户端都无法区分使用相同UID生成的事件,但它们仅添加SEQUENCE最高的事件。从逻辑上讲,我不想在每次邀请时发送多个事件,但RFC允许我这样做(在我的案例研究中我想这样做),那么怎么办?
  4. 对于请求,忘记语句VEVENT | 1+ | 所有组件必须具有相同的UID。,因此为ICS文件中的每个事件提供唯一的UID,Gmail和iOS添加文件中包含的所有事件,而Lightning和Outlook仅添加第一个。是否有一种方法来追求这条路线,还是因为不应该允许,我应该找到另一种方式?
  5. 基本上,您建议如何使用单个ICS文件向用户日历添加多个事件,适用于我提到的平台?

发布的样本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
1个回答

1

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

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

关于3):

iCalendar有一个关于重复会议的异常概念。这些异常由具有相同UID和指示应视为异常的RECURRENCE-ID的VEVENT表示。

因此,REQUEST只能用于传输单个事件(仅一个UID),但该事件本身可以表示为一组VEVENT:一个主要的(例如每周五上午10:00的会议)和每个异常的一个(例如除了星期五12/12在上午09:00举行)。

例如,请参见https://www.rfc-editor.org/rfc/rfc5546#section-4.4.8中的最后一个事件。


我已更新第1点的问题,无论如何,我将通过电子邮件发送日历,无论是作为附件还是嵌入正文中都不重要。关于第2点,这是否意味着像Google Calendar或Lightning这样的客户端有点错误或不完整?那么显然没有办法发送一个适用于多个客户端工作的单个文件,对吗? - ThanksForAllTheFish
你说得对,它们的行为不正确。我怀疑它们将PUBLISH与REQUEST视为同等处理,因此仅允许一个事件(可选地带有VEVENT异常),尽管从4)中看来,gmail正在做与应该做的完全相反的事情。 - Arnaud Quillaud
我之前对于4的理解是错误的。最终,我采取了更加科学的方法,并准备了一份文档,描述不同事件数量、客户端、UID和方法组合的行为。Google日历只添加第一个事件。 - ThanksForAllTheFish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接