使用CardDAV协议在iCloud中处理组

时间:2014-06-13 09:53:59

标签: icloud vcard carddav

我目前正试图通过CardDav协议在iCloud中操纵我的联系人列表组。 为此,我在Contact.app中创建了一个包含联系人的组: Screenshot

当我直接从联系人应用程序导出我的联系人的vCard时,我在CATEGORIES属性中将我的联系人与组相关联:

BEGIN:VCARD
VERSION:3.0
PRODID:-//Apple Inc.//Mac OS X 10.9.2//EN
N:Lebron;Candide;;;
FN:Candide Lebron
ORG:Podbox;
NOTE:Un petit peu candide.
CATEGORIES:GroupForAutomaticTestDELTA
UID:d4c1baf6-f603-4fb5-8f19-d45eb1e7fb23
X-ABUID:D4C1BAF6-F603-4FB5-8F19-D45EB1E7FB23:ABPerson
END:VCARD

但是,当我请求我的iCloud服务器检索此联系人时,我没有设置CATEGORIES属性,但我检索了两个vCards,一个用于联系人,一个用于组。组vCard包含对其成员的引用。

请求:

curl --request REPORT  --user ****@*****:**** --header "Content-Type: text/xml" --data '
    <?xml version="1.0" encoding="utf-8" ?>
        <C:addressbook-query xmlns:D="DAV:"
                 xmlns:C="urn:ietf:params:xml:ns:carddav">
 <D:prop>
   <C:address-data/>
 </D:prop>
 </C:addressbook-query>' https://contacts.icloud.com/802592377/carddavhome/card/

联系VCard:

BEGIN:VCARD&#13;
VERSION:3.0&#13;
PRODID:-//Apple Inc.//Mac OS X 10.9.2//EN&#13;
N:Lebron;Candide;;;&#13;
FN:Candide Lebron&#13;
ORG:Podbox;&#13;
NOTE:Un petit peu candide.&#13;
REV:2014-06-12T16:53:51Z&#13;
UID:d4c1baf6-f603-4fb5-8f19-d45eb1e7fb23&#13;
END:VCARD&#13;

组vCard:

BEGIN:VCARD
VERSION:3.0
PRODID:-//Apple Inc.//AddressBook 8.0//EN
N:GroupToBeAddedTO
FN:GroupToBeAddedTO
X-ADDRESSBOOKSERVER-KIND:group
X-ADDRESSBOOKSERVER-MEMBER:urn:uuid:d4c1baf6-f603-4fb5-8f19-d45eb1e7fb23
REV:2014-06-12T16:43:04Z
UID:d59c9f0c-27aa-47e3-96e7-43717bbc1d7e
END:VCARD

请注意CATEGORIES属性出现在联系人导出中但不出现在CardDAV请求中。我的猜测是,Contact应用程序会在导出时构建CATEGORIES,但我不确定。

有人知道iCloud的工作原理吗?我错过了阻止我通过CardDAV检索CATEGORIES的东西吗?

1 个答案:

答案 0 :(得分:5)

行。让我们从头开始吧。什么是CardDAV系列。 CardDAV集合就像一个包含vCard文件的文件夹。一些(很多?)服务器允许多个这样的文件夹,有些则不允许。 iCloud(当前)属于后一类 - 服务器上只有一个“文件夹”用于存储一个特定iCloud用户的所有vCard。其他服务器有时会调用辅助CardDAV集合'组'。

什么是小组。组是联系人的集合。 Addressbook.app使用特殊的组vCard来表示这种关系。这个“组vCard”通过X-ADDRESSBOOKSERVER-MEMBER属性引用了它的成员。它包含联系vCard(或其他组vCard)的UID,它应该是该组的成员。 在vCard 3中 - 这是大多数CardDAV基础设施使用的 - 这是Apple特有的(因此X-ADDRESSBOOKSERVER-xyz)。在vCard 4中,这已包含在规范中。

Addressbook.app AFAIK不支持真正的CATEGORIES(通常称为标签)。 vCard CATEGORIES字段最初用于'VIP'或'Nice Guy'之类的东西,它本身不适用于'群组'。 现在,当Addressbook.app导出vCard时,它会尝试在CATEGORIES字段中预先提供组信息。这有点奇怪但有些合理。 CardDAV组仅在CardDAV集合中真正有意义,组成员资格信息不包含在vCard本身内(但在该组的单独vCard记录中)。请记住,导出是为了在系统之间传输东西

旁注:如果您来自Exchange / Outlook世界:CardDAV集合就像Exchange文件夹。 CardDAV组就像Exchange分发列表。

我想你真正想知道的是如何在CardDAV组中添加/删除成员?我们假设您有一条记录:

BEGIN:VCARD
UID:joe
N:User;Joe;;;
END:VCARD

你想把他加入一个群体,比如'朋友'。假设该组已经存在,它将看起来像这样(有两个现有成员):

BEGIN:VCARD
N:Friends
FN:Friends
X-ADDRESSBOOKSERVER-KIND:group
X-ADDRESSBOOKSERVER-MEMBER:urn:uuid:AwesomeO
X-ADDRESSBOOKSERVER-MEMBER:urn:uuid:Xavier
UID:group-uid
END:VCARD

添加成员需要做的是获取组然后添加UID,结果如下:

BEGIN:VCARD
N:Friends
FN:Friends
X-ADDRESSBOOKSERVER-KIND:group
X-ADDRESSBOOKSERVER-MEMBER:urn:uuid:AwesomeO
X-ADDRESSBOOKSERVER-MEMBER:urn:uuid:Xavier
X-ADDRESSBOOKSERVER-MEMBER:urn:uuid:joe
UID:group-uid
END:VCARD

有道理吗?

不要被出口的类别黑客搞糊涂。这不是小组的工作方式。