ICS(iCal)发布/请求/取消

时间:2015-02-17 00:54:12

标签: php android ios icalendar

我在从PHP生成的.ics文件中获取条目以进行更新时遇到了很多麻烦。这是我正在使用的一个例子:

<?php
header('Content-type: text/calendar; charset=utf-8');
header('Content-Disposition: attachment; filename=calendar.ics');

$time = time();
$dtstamp = date('Ymd', $time). 'T' . date('His', $time) . 'Z'; echo "\r\n";
?>
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//My Event
METHOD:PUBLISH
X-WR-CALNAME:MyCal
BEGIN:VEVENT
DTSTAMP:<?php echo $dtstamp; ?>
ORGANIZER:someone@example.com
SEQUENCE:0
UID:ABC123
DTSTART:20150601T120000
DTEND:20150601T130000
SUMMARY:Event 1 - <?php echo date('His', $time) ."\r\n"; ?>
LOCATION:Location 1
DESCRIPTION:This is Event 1 - <?php echo date('His', $time) ."\r\n"; ?>
END:VEVENT
BEGIN:VEVENT
DTSTAMP:<?php echo $dtstamp; ?>
ORGANIZER:someone@example.com
SEQUENCE:0
UID:DEF123
DTSTART:20150601T160000
DTEND:20150601T170000
SUMMARY:Event 2 - <?php echo date('His', $time) ."\r\n"; ?>
LOCATION:Location 2
DESCRIPTION:This is Event 2 - <?php echo date('His', $time) ."\r\n"; ?>
END:VEVENT
END:VCALENDAR

因此,这是将事件输出到可以在Android或iOS设备中点击并添加到日历中的URL。下一步是在需要时更新事件项。我一直试图用这样的东西(最初的PHP故意省略):

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//My Event
METHOD:PUBLISH
X-WR-CALNAME:MyCal
BEGIN:VEVENT
DTSTAMP:<?php echo $dtstamp; ?>
ORGANIZER:someone@example.com
SEQUENCE:1
UID:ABC123
DTSTART:20150601T123000
DTEND:20150601T130000
SUMMARY:Event 1 - <?php echo date('His', $time) ."\r\n"; ?>
LOCATION:Location 1
DESCRIPTION:This is Event 1 - <?php echo date('His', $time) ."\r\n"; ?>
END:VEVENT
BEGIN:VEVENT
DTSTAMP:<?php echo $dtstamp; ?>
ORGANIZER:someone@example.com
SEQUENCE:1
UID:DEF123
DTSTART:20150601T163000
DTEND:20150601T170000
SUMMARY:Event 2 - <?php echo date('His', $time) ."\r\n"; ?>
LOCATION:Location 2
DESCRIPTION:This is Event 2 - <?php echo date('His', $time) ."\r\n"; ?>
END:VEVENT
END:VCALENDAR

因为DTSTAMP总是大于前一个条目,所以序列已经递增,并且METHOD更改为REQUEST,据我所知,这应该足够了。

然而,在Android中,它只是再次添加事件,在iOS中它显示已存在的事件以及之前的详细信息,并且仅为您提供再次添加事件的选项。所以,我想知道如何更新现有事件,以及稍后使用METHOD取消它们:如果需要,可以取消。

感谢。

1 个答案:

答案 0 :(得分:2)

你想要做的事情是不可能的。

您可能应该做的是创建iCalendar Feed。 (通常使用webcal://非标准URI架构)。

这样的Feed应该只有METHOD:PUBLISH并且始终包含日历中的每个项目

要更新此Feed中的条目,您只需更新Feed本身即可。您在此Feed中删除的所有项目都将从日历中删除。

METHOD:CANCELMETHOD:REQUEST是其他未在此上下文中使用的iTip方法。它们有两个主要用途:

  1. 电子邮件邀请(a.k.a. iMip)。
  2. CalDAV调度
  3. 这些方法仅对具有ORGANIZERATTENDEE s的iCalendar事件具有意义