我目前正在尝试为系统实现“简单”的只读CALDAV接口。但同步协议和CALDAV客户端给我带来了一些麻烦。
我使用的主要测试客户是macos-calendar(sierra)。 最初的握手(DAV原理,日历查找)和数据的初始加载正在起作用。我得到一些REPORT:日历查询请求。 问题是初始加载后的增量同步。有两种方法:
通过WebSync-extension(REPORT:sync-collection和sync-token prop) 我的主要问题是在我的系统中从服务器配置同步令牌并不简单。更改和新数据不是问题,而是物理删除(尚未记录在用户上下文中)以及组和/或角色分配范围的更改。也许我需要考虑在复杂情况下使sync-token无效并让客户端重置而不进行同步收集? 一个令人讨厌的解决方法可能是保留发送给客户端的日历项ID,并检查每个请求是否存在,并在必要时使用未找到的每个已删除/超出范围的日历项进行响应。但这意味着我将客户端状态存储在服务器上,这听起来不对,可能容易出错。
通过基本的协议同步(响应REPORT:calendar-query和propfind(depth = 1)请求没有webdav-sync激活) 这对于新的和变更的数据原则上也是有效的。但是macos-calendar不会删除不属于集合响应的项目(propfind with depth = 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?
使用Thunderbird Lightning:
与日历集合的初始握手正在运作
使用iCal-Items回答物品的propfind和multiget请求。
但它们没有显示,我收到错误日志:
Warnung:CalDAV:失败:CalDAV:错误:获取状态200获取调试代理的日历数据,null
(德语文本:错误代码:0x80004005)Warnung:Fehler beim Lesen vonDatenfürKalender:Debug Proxy。 Allerdings ist dieser Fehlerwahrscheinlichvernachlässigbar,daher versucht das Programm fortzufahren。 Fehlercode:0x80004005。 Beschreibung:CalDAV:错误:获取状态200获取调试代理的日历数据,null
(德语文本:错误代码:READ_FAILED)Warnung:Fehler beim Lesen vonDatenfürKalender:Debug Proxy。 Allerdings ist dieser Fehlerwahrscheinlichvernachlässigbar,daher versucht das Programm fortzufahren。 Fehlercode:READ_FAILED。 Beschreibung:
http频道监听器OnDataAvailable合同违规
类似的回复是在macos-calendar中工作 - 可能是编码问题吗?
任何提示都非常感谢!
答案 0 :(得分:3)
这确实是一个非常广泛的问题。但是,让我试着解决一些问题:
通过WebSync-extension(REPORT:sync-collection和sync-token prop)我的主要问题是在我的系统中从服务器配置同步令牌并非易事
即使你很难,你也应该尝试在这里提出一些建议。即使这意味着在服务器上存储一些额外的信息。同步收集更有效率。 (想法:也许你至少可以在实际被删除的时候设置一个标志,然后才会使同步令牌失效?)
通过基本协议同步(响应REPORT:calendar-query和propfind(depth = 1))
哪一个calendar-range-query
或PROPFIND
?完全不同的东西......
原则上,这也适用于新的和已更改的数据。但是macos-calendar不会删除不属于集合响应的项目(propfind with depth = 1)。
如果我们正在讨论日历范围查询,则客户端无法主动删除项目,因为它不知道它们是否刚刚离开范围(与被删除)。
PROPFIND
应该这样做。如果您有证据,则可能会创建另一个包含所有相关详细信息的问题。
使用ios-Calendar我面临另一个问题:......一个MKCALENDAR请求即将来临......
这可能意味着它找不到默认的日程安排日历,根本没有日历,没有正确的组件类型属性。或者todos(提醒应用程序,同一帐户)都一样。 MKCALENDAR
的有效载荷是多少?
很难诊断没有细节,如果你无法弄明白,请在上面询问一个特定问题,包括所有相关细节(例如你为回应家庭查询而发送的XML)。
雷鸟闪电
对此不能说太多,可能在很大程度上取决于您使用的版本和扩展名。 AFAIK很多人使用ScalableOGo Thunderbird扩展来使用Thunderbird获得适当的Cal / CardDAV。
答案 1 :(得分:1)
对于Thunderbird / Lightning,您可能需要在高级配置编辑器中打开calendar.debug.log
和calendar.debug.log.verbose
并重新启动。您可以在Options > Advanced > General > Config Editor
中找到它。这将为您提供更详细的http请求以及有关失败的信息。您还可以连接remote debugger并查看网络监视器,或在the code中设置断点。
使用Thunderbird / Lightning请注意我们正在使用webdav-sync草稿的先前版本和当前版本的混合。我不能从错误消息中说出很多内容,因为它非常通用,但看起来结果确实存在意外情况。
比较现有服务器(如sabre/dav)与客户端之间的握手可能是有意义的,然后看看您的通信与他们之间的区别在哪里。
此外,您可能对Apple的CalDAVTester感兴趣,它会检查服务器的互操作性。但请注意,它确实包含各种苹果特定测试。 CalConnect的人们正在与Apple合作,使其更普遍可用,并拆分Apple特定的测试。鉴于您的服务器是只读的,不要期望一切正常,但您可以寻找修复特定测试。