1

我目前正在尝试为系统实现一个“简单”的只读 CALDAV 接口。但是同步协议和 CALDAV 客户端让我有些头疼。

我使用的主要测试客户端是 macos-calendar (sierra)。初始握手(DAV 原理、日历查找)和初始数据加载工作正常。我收到一些 REPORT:calendar-query 请求。问题是初始加载后的增量同步。有两种方法:

  • 通过 WebSync-extension(报告:sync-collection 和 sync-token prop),我的主要问题是从服务器配置同步令牌在我的系统中并非易事。更改和新数据不是问题,而是物理删除(尚未登录用户上下文)和组和/或角色分配范围的更改。也许我需要考虑在复杂情况下使同步令牌无效并让客户端在没有同步收集的情况下重新启动?一个令人讨厌的解决方法可能是保留发送给客户端的日历项 ID,并检查每个请求是否存在,并在必要时对每个已删除/超出范围的日历项进行响应。但这意味着我将客户端状态存储在服务器上,这听起来不正确并且可能容易出错。

  • 通过基本的协议同步(响应 REPORT:calendar-query 和 propfind (depth=1) requests no webdav-sync active),原则上这也适用于新的和更改的数据。但是 macos-calendar 不会删除不属于集合响应的项目​​(propfind 深度=1)。根据协议,客户端应确定已删除的项目并将其删除,但在我的情况下它没有这样做。这里有什么想法吗?对于我的系统,目前使用这种方法是理想的,尽管性能可能不是理想的。

使用 ios-Calendar 我面临另一个问题:

  • 初始握手以某种方式工作,因为网络中的请求即将到来并得到答复。

  • 但是,一个 MKCALENDAR 请求即将到来(而不是日历查询或项目的 propfind),它以 403 回答,因为我也没有在选项响应的 Allow-header 中提供它。请求如下所示:

MKCALENDAR /services/cal/_userid/220EDB4A-F00C-41C9-B78F-10781BBA77E4/ HTTP/1.1 Host: 127.0.0.1:8003 Content-Type: text/xml User-Agent: iOS/10.0.1 (14A403) dataaccessd/1.0 <?xml version="1.0" encoding="UTF-8"?> <B:mkcalendar xmlns:B="urn:ietf:params:xml:ns:caldav"> <A:set xmlns:A="DAV:"> <A:prop> <B:calendar-free-busy-set> <NO/> </B:calendar-free-busy-set> <D:calendar-order xmlns:D="http://apple.com/ns/ical/">1</D:calendar-order> <A:displayname>Kalender</A:displayname> <B:calendar-timezone>BEGIN:VCALENDAR ...deleted.... </B:calendar-timezone> <B:supported-calendar-component-set> <B:comp name="VEVENT"/> </B:supported-calendar-component-set> </A:prop> </A:set> </B:mkcalendar>

  • 之后什么都没有发生。

  • 有人也遇到这种情况吗?为什么 ios-calendar 尝试做一个 mkcalendar 虽然我有一个日历集合作为资源类型?

使用雷鸟闪电:

  • 与日历集合的初始握手正在工作

  • 对项目的 propfind-and multiget 请求由 iCal-Items 回答。

  • 但是它们没有显示,并且在我收到的错误日志中:

  • 警告:CalDAV:获取失败:CalDAV:错误:获取状态 200 为调试代理获取日历数据,null

  • (德语文本:错误代码:0x80004005)警告:Fehler beim Lesen von Daten für Kalender:调试代理。Allerdings ist dieser Fehler wahrscheinlich vernachlässigbar, daher versucht das Programm fortzufahren。费勒代码:0x80004005。Beschreibung: CalDAV: Error: got status 200 fetching calendar data for Debug Proxy, null

  • (德语文本:错误代码:READ_FAILED)警告:Fehler beim Lesen von Daten für Kalender:调试代理。Allerdings ist dieser Fehler wahrscheinlich vernachlässigbar, daher versucht das Programm fortzufahren。费勒代码:READ_FAILED。备考:

  • http 频道监听器 OnDataAvailable 违反合同

  • 类似的响应是在 macos-calendar 中工作——这可能是一些编码问题吗?

任何提示都非常感谢!

4

2 回答 2

4

这确实是一个相当广泛的问题。但让我尝试解决一些问题:

通过 WebSync-extension (REPORT:sync-collection and sync-token prop),我的主要问题是从服务器配置同步令牌在我的系统中并非易事

即使这对您来说很难,您也应该真正尝试在这里提出一些建议。即使这意味着在服务器上存储一些额外的信息。同步收集更有效。(想法:也许您至少可以在实际删除某些内容时设置一个标志,然后才使同步令牌过期?)

通过基本的协议同步(响应 REPORT:calendar-query 和 propfind (depth=1))

哪一个,calendar-range-query或者PROPFIND?完全不同的东西...

这在原则上也适用于新的和更改的数据。但是 macos-calendar 不会删除不属于集合响应的项目​​(propfind 深度=1)。

如果我们谈论的是日历范围查询,客户端无法主动删除项目,因为它不知道它们是否刚刚离开范围(相对于被删除)。

有了PROPFIND它应该做到这一点。如果你有证据证明它没有,也许可以创建另一个包含所有相关细节的问题。

使用 ios-Calendar 我面临另一个问题:...... MKCALENDAR 请求即将到来......

这可能意味着它找不到默认的调度日历,根本没有日历,也没有具有适当组件类型属性的日历。或者对于待办事项都一样(提醒应用程序,相同的帐户)。的有效载荷是MKCALENDAR多少?很难诊断没有详细信息,如果您无法弄清楚,请就此提出一个具体问题,其中包含所有相关详细信息(例如,您为响应主页查询而发送的 XML)。

雷鸟闪电

对此不能多说,可能很大程度上取决于版本和您使用的扩展。AFAIK 许多人使用 ScalableOGo Thunderbird 扩展来通过 Thunderbird 获得适当的 Cal/CardDAV。

于 2016-10-12T23:31:16.300 回答
1

对于 Thunderbird/Lightning,您可能需要打开calendar.debug.logcalendar.debug.log.verbose在高级配置编辑器中重新启动。你可以在Options > Advanced > General > Config Editor. 这将为您提供更详细的 http 请求和有关失败的信息。您还可以连接远程调试器并查看网络监视器,或在代码中设置断点。

请注意,对于 Thunderbird/Lightning,我们混合使用了以前和当前版本的 webdav-sync 草案。我不能从错误消息中说太多,因为它非常笼统,但看起来结果中确实有一些意想不到的东西。

也许比较现有服务器(如sabre/dav )和客户端之间的握手是有意义的,然后看看你的通信和他们的通信之间的区别在哪里。

此外,您可能对 Apple 的CalDAVTester感兴趣,它检查服务器的互操作性。但是请注意,它确实包含各种苹果特定的测试。CalConnect的人员正在与 Apple 合作,以使其更普遍可用,并拆分 Apple 特定的测试。鉴于您的服务器是只读的,不要指望一切都能正常工作,但您可以寻找修复特定测试。

于 2016-10-13T11:11:40.817 回答