連絡先の実際のデータ ソースとして既存のデータベースを使用して、NWebDAVと ASP.NET Core 3.1の上にカスタム CardDAV サーバーを実装しようとしています。(NWebDAV は、 への応答などの基本的な WebDAV 概念を優れたサポートをしているようPROPFIND
です。箱から出して、サンプル プロジェクトを実行してホーム ディレクトリを提供するのはうまくいくようREPORT
です。多くの作業になります。)
メインのテスト クライアントとして iOS 13 を使用しています。
私はそれをうまく取得しました:
- サーバーをアカウントとして追加するときに「検証」を渡します(基本認証を含む)
- 連絡先アプリのグループ ビューで提供している複数のアドレス帳を表示する
だから私はそれPROPFIND
がポイントへの私の応答を解析していることを知っています。しかし、その後、何もありません。REPORT
私の理解では、最初に完全な同期を行うか、検索フィールドに何かを入力するときに特定の連絡先を照会するために、サーバーに対して何らかの要求を発行する必要があります。それは決して試みないようです。
私はそれに次のようなものを与えます:
<addressbook-home-set xmlns="urn:ietf:params:xml:ns:carddav">
<D:href>/addressbooks/sample/108</D:href>
<D:href>/addressbooks/sample/109</D:href>
</addressbook-home-set>
そしてPROPFIND
、次のように、これらのアドレス帳のそれぞれに対してリクエストを発行します。
<?xml version="1.0" encoding="utf-8"?>
<A:propfind xmlns:A="DAV:">
<A:prop>
<A:add-member />
<E:bulk-requests xmlns:E="http://me.com/_namespace/" />
<A:current-user-privilege-set />
<A:displayname />
<E:guardian-restricted xmlns:E="http://me.com/_namespace/" />
<D:max-image-size xmlns:D="urn:ietf:params:xml:ns:carddav" />
<D:max-resource-size xmlns:D="urn:ietf:params:xml:ns:carddav" />
<C:me-card xmlns:C="http://calendarserver.org/ns/" />
<A:owner />
<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 />
<A:resource-id />
<A:resourcetype />
<A:supported-report-set />
<A:sync-token />
</A:prop>
</A:propfind>
これに対して、私は次のように答えます。
<?xml version="1.0" encoding="utf-8"?>
<D:multistatus xmlns:D="DAV:" xmlns:Z="urn:schemas-microsoft-com:">
<D:response>
<D:href>http://localhost:55946/addressbooks/sample/108</D:href>
<D:propstat>
<D:prop>
<D:add-member />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {DAV:}add-member is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<bulk-requests xmlns="http://me.com/_namespace/" />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {http://me.com/_namespace/}bulk-requests is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<guardian-restricted xmlns="http://me.com/_namespace/" />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {http://me.com/_namespace/}guardian-restricted is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<max-image-size xmlns="urn:ietf:params:xml:ns:carddav" />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {urn:ietf:params:xml:ns:carddav}max-image-size is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<max-resource-size xmlns="urn:ietf:params:xml:ns:carddav" />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {urn:ietf:params:xml:ns:carddav}max-resource-size is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<D:owner />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {DAV:}owner is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<push-transports xmlns="http://calendarserver.org/ns/" />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {http://calendarserver.org/ns/}push-transports is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<pushkey xmlns="http://calendarserver.org/ns/" />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {http://calendarserver.org/ns/}pushkey is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<D:quota-available-bytes />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {DAV:}quota-available-bytes is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<D:quota-used-bytes />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {DAV:}quota-used-bytes is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<D:resource-id />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {DAV:}resource-id is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<D:sync-token />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {DAV:}sync-token is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<D:current-user-privilege-set>
<D:privilege>
<D:read />
</D:privilege>
<D:privilege>
<D:read-acl />
</D:privilege>
<D:privilege>
<D:read-current-user-privilege-set />
</D:privilege>
<D:privilege>
<D:write />
</D:privilege>
<D:privilege>
<D:bind />
</D:privilege>
</D:current-user-privilege-set>
<D:displayname>SampleContacts108</D:displayname>
<me-card xmlns="http://calendarserver.org/ns/">
<D:href>/addressbooks/sample/108/contact-49191/</D:href>
</me-card>
<D:resourcetype>
<D:collection />
<addressbook xmlns="urn:ietf:params:xml:ns:carddav" />
</D:resourcetype>
<D:supported-report-set>
<D:supported-report>
<addressbook-query xmlns="urn:ietf:params:xml:ns:carddav" />
</D:supported-report>
<D:supported-report>
<addressbook-multiget xmlns="urn:ietf:params:xml:ns:carddav" />
</D:supported-report>
<D:supported-report>
<D:expand-property />
</D:supported-report>
</D:supported-report-set>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>http://localhost:55946/addressbooks/sample/108/Bar,Foo</D:href>
<D:propstat>
<D:prop>
<D:add-member />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {DAV:}add-member is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<bulk-requests xmlns="http://me.com/_namespace/" />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {http://me.com/_namespace/}bulk-requests is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<D:current-user-privilege-set />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {DAV:}current-user-privilege-set is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<guardian-restricted xmlns="http://me.com/_namespace/" />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {http://me.com/_namespace/}guardian-restricted is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<max-image-size xmlns="urn:ietf:params:xml:ns:carddav" />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {urn:ietf:params:xml:ns:carddav}max-image-size is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<max-resource-size xmlns="urn:ietf:params:xml:ns:carddav" />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {urn:ietf:params:xml:ns:carddav}max-resource-size is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<me-card xmlns="http://calendarserver.org/ns/" />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {http://calendarserver.org/ns/}me-card is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<D:owner />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {DAV:}owner is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<push-transports xmlns="http://calendarserver.org/ns/" />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {http://calendarserver.org/ns/}push-transports is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<pushkey xmlns="http://calendarserver.org/ns/" />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {http://calendarserver.org/ns/}pushkey is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<D:quota-available-bytes />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {DAV:}quota-available-bytes is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<D:quota-used-bytes />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {DAV:}quota-used-bytes is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<D:resource-id />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {DAV:}resource-id is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<D:resourcetype />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {DAV:}resourcetype is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<D:supported-report-set />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {DAV:}supported-report-set is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<D:sync-token />
</D:prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
<D:responsedescription>Property {DAV:}sync-token is not supported.</D:responsedescription>
</D:propstat>
<D:propstat>
<D:prop>
<D:displayname>Bar, Foo</D:displayname>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>
(私が実装しme-card
たのは、そうしないと iOS の連絡先がクラッシュする可能性があり、iOS が少なくともme カードを取得しようとするようになることを期待して、誰かが言ったからです。しかし、悲しいかな。)
この応答には、アドレス帳自体と、その中のサンプル連絡先の両方のメタデータが含まれています。それが正しいかどうかはわかりませんが、その連絡先を外しても何も変わらないようです.
私はレポートaddessbook-query
をサポートしていますaddressbook-multiget
。仕様の8. Address Book Reportsを読むと、これで標準に準拠するのに十分なはずです。
私を困惑させているのは、ただ…何もないということです。ユーザー向けのエラーはなく、それ以上のリクエストもありません。
コンソールで何かを見つけました:
com.apple.dataaccess debug 10:52:13.523530+0200 dataaccessd <private>: There are no server side items to grab, so I'm outta here
しかし、それがこのアカウントを参照しているかどうかはわかりません(別のサーバーである可能性があります)。もしそうなら、iOSがこの結論に至った理由を知りたいですか?
したがって、私の主な質問は次のとおりです。CardDAV クライアントが最終的にREPORT
連絡先を照会する要求を発行する必要があるという基本的な仮定は正しいですか?