【发布时间】:2018-06-02 19:18:53
【问题描述】:
我正在开发一个库来编辑 CardDAV 服务器上的联系人,我想知道同步联系人的正确方法是什么。
因此,当我发现特定联系人的 etag 已更改时:如何同步两者?
我是否只是合并更改的数据,例如电话号码?还是必须一方(服务器或客户端)获胜?以及如何检测号码是否更改或添加?
【问题讨论】:
我正在开发一个库来编辑 CardDAV 服务器上的联系人,我想知道同步联系人的正确方法是什么。
因此,当我发现特定联系人的 etag 已更改时:如何同步两者?
我是否只是合并更改的数据,例如电话号码?还是必须一方(服务器或客户端)获胜?以及如何检测号码是否更改或添加?
【问题讨论】:
Building a CardDAV client 文档很好地解释了这一切。
但要解决您的问题:
因此,当我发现特定联系人的 etag 发生更改时:如何同步两者?
您从服务器加载 vCard。然后,这取决于您的客户的逻辑。你想自动合并吗?是否要提示用户是否要合并?等等。
通常您希望自动合并。所以这样做。获得合并的 vCard 后,再次将其放入服务器,但请确保使用 If-Match 标头以确保它不会在服务器端再次更改。
我是否只是合并更改的数据,例如电话号码?
您认为有用的完全取决于您的应用程序。但是仅仅组合字段可能不是你想要的。例如,您将无法检测到 删除。 所以在大多数情况下,这将是一个三向合并:
或者必须一方(服务器或客户端)获胜?
有些客户会这样做,但这不是必需的。但是,如果您在更改后进行修改,则需要非常小心同步周期!
以及如何检测号码是否更改或添加?
您存储您知道和比较的旧副本。
一般来说,将(最后知道的)不透明的服务器副本存储在本地是一个好主意,只需挑选出您的客户关心的字段即可。然后在再次上传项目时,您只需再次修补这些项目。 (并保留服务器发送给您的其余内容)。
总结:正确的 vCard diff 和本地缓存并非易事。许多客户端在这方面失败了,并且丢失或欺骗了用户数据。 因此,除非您打算为此投入必要的工作和测试,否则更简单的方法是检测更改并询问用户他想做什么(让服务器获胜、强制用户复制、合并)。
【讨论】: