1

我正在尝试使用 caldav 和同步报告来实现同步,但是我遇到了关于如何在多个客户端和服务器之间同步一个日历(一个 VEVENT)的概念问题。

大多数 rfc 是指使用 etag 来确定资源自上次同步以来是否已更改。(如果 etag 更改,则资源自上次同步后已更改)。我明白了。但是我怎么知道哪个变化是最近的?

例如,客户端 A 有一个在凌晨 1 点最后编辑的 ical“X”,它们在上午 8 点同步。客户端 B 也有一个 ical X 版本,他们在凌晨 2 点编辑并在早上 7 点同步。所以 B 比 A 更新,B 在 A 之前同步。

当 A 同步时,它将看到 B 的新版本 X。从 etag 中它知道 X 已更改,但不是“何时”更改。我假设 A 应该用 B 覆盖,因为 B 较新(或者至少能够提示用户说 B 较新)....这个假设是否正确/是否有处理这种情况的标准方法?

通常的问题是当试图找出服务器和客户端之间的文件更新时。etag 只能检测“更改”但不能检测“更新”。最后修改日期似乎反映了 icals 上传日期,而不是它在客户端上的最后编辑日期。这让我相信我错过了一些东西。是否有一些普遍接受的同步算法?

4

2 回答 2

1

最后的编辑日期只是这里等式的一部分。更有意义的是实际的修改。您可能关闭了设备 B 的警报(微不足道的更改),但更改了设备 A 的开始日期(重大更改)。因此,表现良好的客户应该尽最大努力尝试将两者合并。一些客户只会通知您该事件已被编辑,并会询问您要保留哪个副本,但没有并排比较 UI,这对最终用户来说确实很混乱。如果没有合并机制,我只会忽略 etag 并始终覆盖。

最后,您还应该担心事件的时间表标签(请参阅https://www.rfc-editor.org/rfc/rfc6638#section-3.2.10)。

于 2013-02-15T08:07:17.377 回答
1

iCal 文件还应包含 SEQUENCE 编号(在每次编辑时递增),这比编辑日期更重要。通过比较 SEQUENCE 至少您可以决定如果双方的值不相等,则哪个编辑较新。

于 2013-11-27T15:52:35.557 回答