jjzjj

ios - 开发 Carddav/Caldav 服务器。同步后事件在 iOS 客户端消失

coder 2024-01-23 原文

我目前正在开发一个 carddav/caldav 服务器。我已经可以在 windows/windows phone/android 上与很多客户交流。现在我尝试与 iOS 同步。地址簿同步工作正常,但日历应用程序行为异常。它同步所有日历和约会并正确显示它们。它甚至将事件的参与者链接到地址簿中的联系人。但是一旦同步完成,日历和约会就会完全消失。有人有提示吗?

我的测试设备是装有 iOS 8.3 (12F69) 的 iPad 2。

这是通讯。我省略了没有授权 header 的请求。我还必须编辑主机名,但它在所有请求中都是相同的。

我不会回答 iOS 询问的很多属性。但由于所有约会都在短时间内正确显示,因此不需要这些。还有很多它们不是 caldav 规范的一部分(但仍然放在同一个 xmlns 中?)。

初步发现

请求

PROPFIND host:9998/.well-known/caldav HTTP/1.1
Host: host:9998
User-Agent: iOS/8.3 (12F69) accountsd/1.0
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: text/xml
Prefer: return=minimal
Depth: 0
Connection: keep-alive
Authorization: Basic ZmdoZ2poZ2g6a2dmZ2hqaA==
Content-Length: 181
Brief: t

<?xml version="1.0" encoding="UTF-8"?>
<A:propfind xmlns:A="DAV:">
  <A:prop>
    <A:current-user-principal/>
    <A:principal-URL/>
    <A:resourcetype/>
  </A:prop>
</A:propfind>

响应

HTTP/1.1 207 Multi-Status
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml
Content-Length: 791
Date: Tue, 15 Dec 2015 08:25:22 GMT

<?xml version="1.0" encoding="UTF-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cs="http://calendarserver.org/ns/">
  <d:response>
    <d:href>/.well-known/caldav/</d:href>
    <d:propstat>
      <d:prop>
        <d:resourcetype>
          <d:collection/>
        </d:resourcetype>
        <d:current-user-principal>
          <d:href>/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
        </d:current-user-principal>
        <d:principal-url>
          <d:href>/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
        </d:principal-url>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>

选项

请求

OPTIONS http://host:9998/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/ HTTP/1.1
Host: host:9998
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Accept-Encoding: gzip, deflate
Accept: */*
Content-Length: 0
Accept-Language: de-de
Connection: keep-alive
User-Agent: iOS/8.3 (12F69) accountsd/1.0

响应

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml
Content-Length: 0
Date: Tue, 15 Dec 2015 08:25:22 GMT

Propfind(我这里不回答很多属性)

请求

PROPFIND host:9998/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/ HTTP/1.1
Host: host:9998
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: text/xml
Prefer: return=minimal
Depth: 0
Connection: keep-alive
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Content-Length: 743
Brief: t
<A:propfind xmlns:A="DAV:">
  <A:prop>
    <B:calendar-home-set xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <B:calendar-user-address-set xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <A:current-user-principal/>
    <A:displayname/>
    <C:dropbox-home-URL xmlns:C="http://calendarserver.org/ns/"/>
    <C:email-address-set xmlns:C="http://calendarserver.org/ns/"/>
    <C:notification-URL xmlns:C="http://calendarserver.org/ns/"/>
    <A:principal-collection-set/>
    <A:principal-URL/>
    <A:resource-id/>
    <B:schedule-inbox-URL xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <B:schedule-outbox-URL xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <A:supported-report-set/>
  </A:prop>
</A:propfind>

响应

HTTP/1.1 207 Multi-Status
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml
Content-Length: 958
Date: Tue, 15 Dec 2015 08:25:48 GMT

<?xml version="1.0" encoding="UTF-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cs="http://calendarserver.org/ns/">
  <d:response>
    <d:href>/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
    <d:propstat>
      <d:prop>
        <d:displayname>Robert Glaser</d:displayname>
        <d:current-user-principal>
          <d:href>/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
        </d:current-user-principal>
        <cal:calendar-home-set>
          <d:href>/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/</d:href>
        </cal:calendar-home-set>
        <d:principal-url>
          <d:href>/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
        </d:principal-url>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>

寻找

请求

PROPFIND http://host:9998/.well-known/carddav/DEVELOPMENT/principals/Robert%20Glaser/ HTTP/1.1
Host: host:9998
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: text/xml
Prefer: return=minimal
Depth: 0
Connection: keep-alive
Authorization: Basic Z2poZ2o6amhqamo=
Content-Length: 439
Brief: t

<?xml version="1.0" encoding="UTF-8"?>
<A:propfind xmlns:A="DAV:">
  <A:prop>
    <D:addressbook-home-set xmlns:D="urn:ietf:params:xml:ns:carddav"/>
    <D:directory-gateway xmlns:D="urn:ietf:params:xml:ns:carddav"/>
    <A:displayname/>
    <C:email-address-set xmlns:C="http://calendarserver.org/ns/"/>
    <A:principal-collection-set/>
    <A:principal-URL/>
    <A:resource-id/>
    <A:supported-report-set/>
  </A:prop>
</A:propfind>

响应

HTTP/1.1 207 Multi-Status
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml
Content-Length: 795
Date: Tue, 15 Dec 2015 08:25:48 GMT

<?xml version="1.0" encoding="UTF-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cs="http://calendarserver.org/ns/">
  <d:response>
    <d:href>/.well-known/carddav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
    <d:propstat>
      <d:prop>
        <d:displayname>Robert Glaser</d:displayname>
        <card:addressbook-home-set>
          <d:href>/.well-known/carddav/DEVELOPMENT/addressbooks/</d:href>
        </card:addressbook-home-set>
        <d:principal-url>
          <d:href>/.well-known/carddav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
        </d:principal-url>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>

寻找

请求

PROPFIND http://host:9998/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/ HTTP/1.1
Host: host:9998
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: text/xml
Prefer: return=minimal
Depth: 1
Connection: keep-alive
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Content-Length: 2097
Brief: t

<?xml version="1.0" encoding="UTF-8"?>
<A:propfind xmlns:A="DAV:">
  <A:prop>
    <A:add-member/>
    <C:allowed-sharing-modes xmlns:C="http://calendarserver.org/ns/"/>
    <F:autoprovisioned xmlns:F="http://apple.com/ns/ical/"/>
    <E:bulk-requests xmlns:E="http://me.com/_namespace/"/>
    <F:calendar-color xmlns:F="http://apple.com/ns/ical/"/>
    <B:calendar-description xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <B:calendar-free-busy-set xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <F:calendar-order xmlns:F="http://apple.com/ns/ical/"/>
    <B:calendar-timezone xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <A:current-user-privilege-set/>
    <B:default-alarm-vevent-date xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <B:default-alarm-vevent-datetime xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <A:displayname/>
    <C:getctag xmlns:C="http://calendarserver.org/ns/"/>
    <F:language-code xmlns:F="http://apple.com/ns/ical/"/>
    <F:location-code xmlns:F="http://apple.com/ns/ical/"/>
    <A:owner/>
    <C:pre-publish-url xmlns:C="http://calendarserver.org/ns/"/>
    <C:publish-url xmlns:C="http://calendarserver.org/ns/"/>
    <C:push-transports xmlns:C="http://calendarserver.org/ns/"/>
    <C:pushkey xmlns:C="http://calendarserver.org/ns/"/>
    <A:quota-available-bytes/>
    <A:quota-used-bytes/>
    <F:refreshrate xmlns:F="http://apple.com/ns/ical/"/>
    <A:resource-id/>
    <A:resourcetype/>
    <B:schedule-calendar-transp xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <B:schedule-default-calendar-URL xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <C:source xmlns:C="http://calendarserver.org/ns/"/>
    <C:subscribed-strip-alarms xmlns:C="http://calendarserver.org/ns/"/>
    <C:subscribed-strip-attachments xmlns:C="http://calendarserver.org/ns/"/>
    <C:subscribed-strip-todos xmlns:C="http://calendarserver.org/ns/"/>
    <B:supported-calendar-component-set xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <B:supported-calendar-component-sets xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <A:supported-report-set/>
    <A:sync-token/>
  </A:prop>
</A:propfind>

响应

HTTP/1.1 207 Multi-Status
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml
Content-Length: 2984
Date: Tue, 15 Dec 2015 08:25:49 GMT

<?xml version="1.0" encoding="UTF-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cs="http://calendarserver.org/ns/">
  <d:response>
    <d:href>/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/</d:href>
    <d:propstat>
      <d:prop>
        <d:resourcetype>
          <d:collection/>
        </d:resourcetype>
        <cs:getctag/>
        <d:displayname>Robert Glaser</d:displayname>
        <d:current-user-privilege-set>
          <d:privilege>
            <d:all/>
          </d:privilege>
          <d:privilege>
            <d:read/>
          </d:privilege>
          <d:privilege>
            <d:read-acl/>
          </d:privilege>
          <d:privilege>
            <d:write/>
          </d:privilege>
          <d:privilege>
            <d:write-content/>
          </d:privilege>
          <d:privilege>
            <d:read-current-user-privilege-set/>
          </d:privilege>
        </d:current-user-privilege-set>
        <d:owner>
          <d:href>/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
        </d:owner>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
  <d:response>
    <d:href>/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/</d:href>
    <d:propstat>
      <d:prop>
        <d:resourcetype>
          <d:collection/>
          <cal:calendar/>
        </d:resourcetype>
        <cs:getctag>669801837942</cs:getctag>
        <d:displayname>Alle Termine</d:displayname>
        <d:supported-report-set>
          <d:supported-report>
            <d:report>
              <cal:calendar-multiget/>
            </d:report>
          </d:supported-report>
          <d:supported-report>
            <d:report>
              <cal:calendar-query/>
            </d:report>
          </d:supported-report>
        </d:supported-report-set>
        <d:current-user-privilege-set>
          <d:privilege>
            <d:all/>
          </d:privilege>
          <d:privilege>
            <d:read/>
          </d:privilege>
          <d:privilege>
            <d:read-acl/>
          </d:privilege>
          <d:privilege>
            <d:write/>
          </d:privilege>
          <d:privilege>
            <d:write-content/>
          </d:privilege>
          <d:privilege>
            <d:read-current-user-privilege-set/>
          </d:privilege>
        </d:current-user-privilege-set>
        <cal:supported-calendar-component-set>
          <cal:comp name="VEVENT"/>
          <cal:comp name="VTIMEZONE"/>
        </cal:supported-calendar-component-set>
        <d:owner>
          <d:href>/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
        </d:owner>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>

Proppatch(未实现

请求

PROPPATCH http://host:9998/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/ HTTP/1.1
Host: host:9998
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Accept-Encoding: gzip, deflate
Content-Type: text/xml
Accept-Language: de-de
Content-Length: 198
Accept: */*
Connection: keep-alive
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0

<?xml version="1.0" encoding="UTF-8"?>
<A:propertyupdate xmlns:A="DAV:"><A:set><A:prop><F:calendar-order xmlns:F="http://apple.com/ns/ical/">0</F:calendar-order></A:prop></A:set></A:propertyupdate>

响应

HTTP/1.1 501 Not Implemented
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Language: en
Content-Length: 1029
Date: Tue, 15 Dec 2015 08:25:49 GMT
Connection: close

<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.24 - Error report</title><style type="text/css">H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}.line {height: 1px; background-color: #525D76; border: none;}</style> </head><body><h1>HTTP Status 501 - </h1><div class="line"></div><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The server does not support the functionality needed to fulfill this request.</u></p><hr class="line"><h3>Apache Tomcat/8.0.24</h3></body></html>

寻找

请求

PROPFIND http://host:9998/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/ HTTP/1.1
Host: host:9998
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: text/xml
Prefer: return=minimal
Depth: 0
Connection: keep-alive
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Content-Length: 267
Brief: t

<?xml version="1.0" encoding="UTF-8"?>
<A:propfind xmlns:A="DAV:">
  <A:prop>
    <B:calendar-user-address-set xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <A:displayname/>
    <C:email-address-set xmlns:C="http://calendarserver.org/ns/"/>
  </A:prop>
</A:propfind>

响应

HTTP/1.1 207 Multi-Status
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml
Content-Length: 500
Date: Tue, 15 Dec 2015 08:25:49 GMT

<?xml version="1.0" encoding="UTF-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cs="http://calendarserver.org/ns/">
  <d:response>
    <d:href>/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
    <d:propstat>
      <d:prop>
        <d:displayname>Robert Glaser</d:displayname>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>

MKCALENDAR(未实现)

请求

MKCALENDAR http://host:9998/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/B39676BE-F124-475E-9ED2-B8756951DF29/ HTTP/1.1
Host: host:9998
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Accept-Encoding: gzip, deflate
Content-Type: text/xml
Accept-Language: de-de
Content-Length: 1046
Accept: */*
Connection: keep-alive
User-Agent: iOS/8.3 (12F69) 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>
      <F:calendar-order xmlns:F="http://apple.com/ns/ical/">0</F:calendar-order>
      <B:calendar-timezone>BEGIN:VCALENDAR&#13;
VERSION:2.0&#13;
CALSCALE:GREGORIAN&#13;
BEGIN:VTIMEZONE&#13;
TZID:Europe/Berlin&#13;
BEGIN:DAYLIGHT&#13;
TZOFFSETFROM:+0100&#13;
TZNAME:MESZ&#13;
TZOFFSETTO:+0200&#13;
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU&#13;
DTSTART:19810329T020000&#13;
END:DAYLIGHT&#13;
BEGIN:STANDARD&#13;
TZOFFSETFROM:+0200&#13;
TZNAME:MEZ&#13;
TZOFFSETTO:+0100&#13;
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU&#13;
DTSTART:19961027T030000&#13;
END:STANDARD&#13;
END:VTIMEZONE&#13;
END:VCALENDAR&#13;
</B:calendar-timezone>
      <A:displayname>Erinnerungen</A:displayname>
      <B:calendar-free-busy-set>
        <NO/>
      </B:calendar-free-busy-set>
      <B:supported-calendar-component-set>
        <B:comp name="VTODO"/>
      </B:supported-calendar-component-set>
    </A:prop>
  </A:set>
</B:mkcalendar>

响应

HTTP/1.1 501 Not Implemented
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Language: en
Content-Length: 1029
Date: Tue, 15 Dec 2015 08:25:49 GMT
Connection: close

<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.24 - Error report</title><style type="text/css">H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}.line {height: 1px; background-color: #525D76; border: none;}</style> </head><body><h1>HTTP Status 501 - </h1><div class="line"></div><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The server does not support the functionality needed to fulfill this request.</u></p><hr class="line"><h3>Apache Tomcat/8.0.24</h3></body></html>

Propfind(在日历上,我这里不回答sync token)

PROPFIND http://host:9998/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/ HTTP/1.1
Host: host:9998
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: text/xml
Prefer: return=minimal
Depth: 0
Connection: keep-alive
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Content-Length: 181
Brief: t

<?xml version="1.0" encoding="UTF-8"?>
<A:propfind xmlns:A="DAV:">
  <A:prop>
    <C:getctag xmlns:C="http://calendarserver.org/ns/"/>
    <A:sync-token/>
  </A:prop>
</A:propfind>

响应

HTTP/1.1 207 Multi-Status
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml
Content-Length: 507
Date: Tue, 15 Dec 2015 08:25:51 GMT

<?xml version="1.0" encoding="UTF-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cs="http://calendarserver.org/ns/">
  <d:response>
    <d:href>/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/</d:href>
    <d:propstat>
      <d:prop>
        <cs:getctag>669801837942</cs:getctag>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>

Propfind(查找所有约会)

请求

PROPFIND host:9998/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/ HTTP/1.1
Host: host:9998
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: text/xml
Prefer: return=minimal
Depth: 1
Connection: keep-alive
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Content-Length: 145
Brief: t

<?xml version="1.0" encoding="UTF-8"?>
<A:propfind xmlns:A="DAV:">
  <A:prop>
    <A:getcontenttype/>
    <A:getetag/>
  </A:prop>
</A:propfind>

Response(响应中有更多约会,我这里只显示第一个,但它们看起来都一样,只是 hrefs 不同)

HTTP/1.1 207 Multi-Status
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml
Transfer-Encoding: chunked
Date: Tue, 15 Dec 2015 08:25:54 GMT

2000
<?xml version="1.0" encoding="UTF-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cs="http://calendarserver.org/ns/">
  <d:response>
    <d:href>/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/</d:href>
    <d:propstat>
      <d:prop/>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
  <d:response>
    <d:href>/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/0075712608923743A35868DB6A589A31.ics</d:href>
    <d:propstat>
      <d:prop>
        <d:getetag>1241532994</d:getetag>
        <d:getcontenttype>text/calendar</d:getcontenttype>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>

报告(下载所有约会,再次忽略其他 href)

请求

REPORT http://host:9998/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/ HTTP/1.1
Host: host:9998
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Accept-Encoding: gzip, deflate
Content-Type: text/xml
Accept-Language: de-de
Content-Length: 7677
Accept: */*
Connection: keep-alive
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0

<?xml version="1.0" encoding="UTF-8"?>
<B:calendar-multiget xmlns:B="urn:ietf:params:xml:ns:caldav">
  <A:prop xmlns:A="DAV:">
    <A:getetag/>
    <B:calendar-data/>
    <C:created-by xmlns:C="http://calendarserver.org/ns/"/>
    <C:updated-by xmlns:C="http://calendarserver.org/ns/"/>
    <B:schedule-tag/>
  </A:prop>
  <A:href xmlns:A="DAV:">/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/50EAF942E0AB35A1B81792F7AAB6027E.ics</A:href>
</B:calendar-multiget>

响应

HTTP/1.1 207 Multi-Status
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml;charset=utf-8
Date: Tue, 15 Dec 2015 08:25:58 GMT
Content-Length: 58259

<?xml version="1.0" encoding="UTF-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cs="http://calendarserver.org/ns/">
  <d:response>
    <d:href>/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/50EAF942E0AB35A1B81792F7AAB6027E.ics</d:href>
    <d:propstat>
      <d:prop>
        <d:getetag>1447948122</d:getetag>
        <cal:calendar-data>BEGIN:VCALENDAR&#13;
CALSCALE:GREGORIAN&#13;
VERSION:2.0&#13;
PRODID:-//DE/RND/DAV/CALDAV &#13;
BEGIN:VEVENT&#13;
DTSTAMP:20151215T082555Z&#13;
CLASS:PUBLIC&#13;
DESCRIPTION:&#13;
DTSTART:20151120T070000Z&#13;
DTEND:20151120T073000Z&#13;
SUMMARY:NeuerMehrTeilnehmerTermin&#13;
TRANSP:OPAQUE&#13;
ATTENDEE;CN=Robert Glaser;PARTSTAT=ACCEPTED:mailto:robert.glaser@web.de&#13;
RESOURCES:Audi A6&#13;
UID:50EAF942E0AB35A1B81792F7AAB6027E&#13;
CREATED:20151119T154839Z&#13;
LAST-MODIFIED:20151119T154839Z&#13;
END:VEVENT&#13;
END:VCALENDAR&#13;
</cal:calendar-data>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>

在此之后,还有 4 个 REPORT 请求来获取所有约会。 之后,在主机的根目录中有一个 propfind 请求,由于 30.000 个字符的限制,我无法发布。我无法回答这个请求,因为它没有到达我的 servlet。

感谢您的帮助。

最佳答案

今天,我终于可以修复错误了。在第一个请求中,ios 要求提供 principal-URL,而我回答了 principal-url。为了被 iOS 识别,这个标记名的最后部分必须用大写字母书写。它使用 URL 在同步后向委托(delegate)人发出一个(我认为毫无意义的)请求。

关于ios - 开发 Carddav/Caldav 服务器。同步后事件在 iOS 客户端消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34269944/

有关ios - 开发 Carddav/Caldav 服务器。同步后事件在 iOS 客户端消失的更多相关文章

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  3. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  4. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  5. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  6. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  7. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  8. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  9. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  10. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

随机推荐