用PHP将日历公开为具有订阅选项的iCal

8
我有一个PHP应用程序,每个用户都有他的相关事件。
我想要做的是以类似Facebook事件的方式公开他的事件,Facebook以webcal://www.facebook.com/ical/b.php?uid=123456789&key=ASD123ASD123ASD格式提供URL,每当有新事件时,它会自动传播到我添加到Google日历的日历中。
我想要做的是在URL上公开此日历,例如http://whatever.org/someLongUniquePerUserIdentifier.ics
我尝试使用一个与URL相同的简单文件来模拟事件生成脚本。它是一个被Google使用的ics文件,事件已经被添加,但是当我更改文件内容(删除事件)=更改应订阅Google日历的资源时,更改根本没有传递到gcal。
由于我找不到任何可靠的文档来源,我尝试使用不同的关键字进行了大量谷歌搜索,只被引导到像DAVical、sabredav等WebDAV服务器。
我已经在我的服务器上安装了DAVical,只是为了达到一个状态,我已经正确安装了服务器,但不知道如何在我想要的URL上公开来自我的MySQL数据库的事件,客户端将订阅该事件。
与sabredav相同,除了我没有尝试让它工作,因为我看不到任何记录的方法可以使用任何dav服务器将我的事件传播到世界上。
我基本上陷入了一个境地,在这个境地中,我有一个在PHP中工作的ics导出,但是没有被日历客户端要求更新,以及一个正在运行的CalDAV服务器,客户端可能会要求更新,但没有数据返回。
有什么想法吗?
编辑后的问题:
实现即时单向日历同步的正确方法是什么?

请注意:ICS源的更改可能需要长达8小时才能在您的Google日历中反映出来。 - eggyal
@eggyal将其集成到我的答案中。 OP不相信它是通过轮询间隔来完成的。 - Chris Wesseling
2个回答

9
如果我没记错的话,似乎你只需要将链接从 http://whatever.org/someLongUniquePerUserIdentifier.ics 改成 webcal://whatever.org/someLongUniquePerUserIdentifier.ics webcal 协议应该会在你的日历软件中触发“订阅”操作。如果你看到它下载文件,那么就不是在订阅。

1
从我谷歌搜索的结果来看,我相信我需要一个CalDAV服务器才能使同步工作。仅仅改变方案并没有起作用,这是我尝试的第一件事情之一。 - Elwhis
我已经成功地实现了同步,而不需要使用CalDAV服务器。我只是生成了一个.ics文件,并使用webcal://链接到它。当单击链接时,iCal应用程序会打开并显示订阅对话框,而不是导入对话框(这是我使用http://时的情况)。当您在日历应用程序中手动订阅您的.ics URL时,是否可以正常工作? - jessica
@Elwhis 如果您想要进行双向同步,只需要运行CalDAV即可... CalDAV类似于webcal,就像WebDAV类似于rssfeed一样。如果您不希望您的客户端向服务器写入数据,那么您真的不需要使用DAV扩展程序。 - Chris Wesseling

6

.ics格式在RFC 55456868中定义。您可以自己实现输出。但由于它包含像UTC日期时间这样的棘手部分,使用库可能更加健壮。

订阅您的事件只是将您的网址添加到日历应用程序中,该应用程序将轮询其进行更改。删除事件可能不会将其从日历中移除,应将其状态更改为CANCELLED。

我对任何关于该格式的PHP库都没有经验,但是谷歌搜索可以为您提供很多信息。看起来Drupal项目正在讨论它并尝试使用iCalcreator
如果你不相信我:

Outlook

在Outlook中添加互联网日历订阅 互联网日历订阅是您在Outlook中下载和查看的一种日历。但是,与日历快照不同,互联网日历订阅会自动更新。

这些日历可以在人们托管日历的网站上找到。在这样的网站上,您可以单击链接以下载和订阅日历,或者某人可以通过电子邮件向您发送互联网日历订阅的链接。该链接是一个以webcal://开头而不是http://结尾的互联网网址,并以.ics文件扩展名结尾。

Google Calendar

选择“从菜单中选择通过URL添加”。 找到以iCalendar格式呈现的Google日历地址,或者如果您有来自其他应用程序(例如Apple的iCal)的日历的iCalendar地址,则也可以使用此地址。 在提供的字段中输入地址。
注意:ICS源中的更改可能需要长达8小时才能反映在您的Google日历中。
自从Wayback之后就一直是这样。
您还应该将此日历视为应定期检查更改而不是导入一次的日历。 简单而有效。
因此,如果“实际上并非如此,您只需将URL添加到日历资源中即可自动更新”,那么这可能与“webcal” URI方案是非官方的事实有关,而IANA文档则充满了未知。
如果您只需要单向同步,那么您不需要DAV服务器。如果您希望客户端也能更新您服务器上的日历,则只需要CalDAV服务器进行双向同步。

1
感谢您的更新。问题是,“可能需要长达8小时”,这让我认为更改根本没有传播。但是,如果您想要即时单向同步呢? - Elwhis
1
@elwhis 大多数客户端都有刷新功能,不知道谷歌是否提供。 - Chris Wesseling
1
@elwhis 当然,你可以开始标准化。然后成为采用的倡导者,然后希望你的用户更新其客户端。但是为什么你需要即时更新呢?你只需要在下一个事件之前让你的用户及时更新即可。 - Chris Wesseling
我需要它,因为它不是一个活动策划应用程序,而是你的工作日历,你需要随时更新,而不是明天。 - Elwhis
1
@NinoŠkopac 首先,这听起来像是一个问题,而不是一个评论。;-) 其次:https://dev59.com/sHRC5IYBdhLWcg3wROtQ#17979482 - Chris Wesseling
显示剩余3条评论

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