【问题标题】:Exposing calendar as an iCal with subscribe option in PHP在 PHP 中使用订阅选项将日历公开为 iCal
【发布时间】:2014-06-06 01:41:29
【问题描述】:

我有一个 PHP 应用程序,其中每个用户都有他的关联事件。

我想做的是以类似于 facebook 上的事件的方式公开他的事件,该事件以 webcal://www.facebook.com/ical/b.php?uid=123456789&key=ASD123ASD123ASD 格式提供网址,每当有新事件时,它会自动传播到我添加到我的日历中谷歌日历。

我想要做的是在诸如http://whatever.org/someLongUniquePerUserIdentifier.ics 之类的 url 上公开这个日历。

我尝试使用位于同一 url 的简单文件来模拟事件生成脚本。这是一个由谷歌使用的ics文件,事件已经添加,但是当我更改文件内容(删除一个事件)=更改了应该订阅谷歌日历的资源时,更改根本没有通过到 gcal。

由于我无法找到任何可靠的文档来源,我尝试使用不同的关键字进行大量谷歌搜索,但我只被引导到 DAVical、sabredav 等 webdav 服务器。

我在我的服务器上安装了 DAVical 只是为了达到我正确安装服务器的状态,但不知道如何在我想要的 url 上公开我的 MySQL 数据库中的事件,这将是客户端订阅的。

与 sabredav 相同,除了我没有尝试让它工作的事实,因为我看不到使用任何 dav 服务器将我的事件发布到世界的任何记录方式。

我基本上被困在一个地方,我在 PHP 中工作 ics 导出,日历客户端没有要求更新,而客户端可能会要求更新,但没有数据返回。

有什么想法吗?

已编辑问题:

实现即时单向日历同步的正确方法是什么?

【问题讨论】:

标签: php mysql calendar webdav webcal


【解决方案1】:

如果我没记错的话,您似乎只需将链接从http://whatever.org/someLongUniquePerUserIdentifier.ics 更改为 到 webcal://whatever.org/someLongUniquePerUserIdentifier.ics

webcal 协议应该在您的日历软件中触发“订阅”操作。如果您看到它下载文件,则说明它没有订阅。

【讨论】:

  • 从我用谷歌搜索的内容来看,我确信我需要一些 CalDAV 服务器才能使同步工作。简单地改变方案是行不通的,这是我尝试的第一件事。
  • 我确实可以在没有 CalDAV 服务器的情况下进行同步。我只是生成一个 .ics 文件并使用 webcal:// 链接到它。单击链接时,iCal 应用程序打开并打开订阅对话框而不是导入对话框(这是我使用 http:// 时的内容)。当您在日历应用中手动订阅 .ics 网址时,它会起作用吗?
  • @Elwhis 如果您想要 2 路同步,您只需要运行 CalDAV...CalDAV 与 webcal 一样,WebDAV 与 rssfeed 相同。如果您不希望您的客户端写入到您的服务器,您真的不需要 DAV 扩展。
【解决方案2】:

.ics 格式在 RFC 5545 和 6868 中定义。你可以自己实现你的输出。但由于它包含 UTC 日期时间等棘手的部分,因此使用库时可能会更健壮。

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

我对这种格式的任何 PHP 库都没有经验,但googling for it 会给你很多。它看起来像 Drupal project is discussing it 并且正在尝试 iCalcreator。


如果你不相信我的话:

Outlook

将 Internet 日历订阅添加到 Outlook Internet 日历订阅是您在 Outlook 中下载和查看的日历。但是,与日历快照不同的是,Internet 日历订阅会自动更新。

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

Google Calendar

从菜单中选择通过 URL 添加。 以 iCalendar 格式查找 Google 日历的地址,或者如果您有来自其他应用程序(例如 Apple 的 iCal)的日历的 iCalendar 地址,您也可以使用它。 在提供的字段中输入地址。

[...]

注意:ICS 供稿的更改最多可能需要 8 小时才能反映在您的 Google 日历中

从那以后就一直这样

Wayback

[...]您还应该将此日历视为应定期检查更改的内容,而不是一次性导入的日历。简单但有效。

所以如果it really isnt the case,where you just add url to your the ics resource to your calendar and it will automatically update,那么这可能与webcal uri-scheme 是非官方的并且IANA 文档充满未知的事实有关。


如果您只需要单向同步,则不需要 DAV 服务器。您只需要一个 CalDAV 服务器即可进行 2 路同步;如果您希望客户端也更新您服务器上的日历。

【讨论】:

  • 感谢您的回答,但实际上并非如此,您只需将 ics 资源的 url 添加到日历中,它就会自动更新。我尝试公开 ICS 文件并对其进行修改(如上所述),而不会将更改传播到日历。生成 iCal 也没有问题,我也在问题中说明了这一点。
  • 感谢您的更新。问题是,“可能需要长达 8 小时”,这让我认为这些更改根本没有传播。但是,如果您想要即时单向同步呢?
  • @elwhis 大部分客户端都有刷新功能,不知道谷歌有没有提供。
  • @elwhis 当然,您可以开始标准化。然后成为采用的倡导者,然后希望您的用户群更新其客户。但为什么需要即时更新?您只需要为下一次活动及时更新您的用户
  • @NinoŠkopac 首先,听起来像是一个问题,而不是评论。 ;-) 其次:stackoverflow.com/a/17979482
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 2012-08-25
相关资源
最近更新 更多