我目前正在尝试为系统实现一个“简单”的只读 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 中工作——这可能是一些编码问题吗?
任何提示都非常感谢!