3

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

当我直接从联系人应用程序导出联系人的 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 属性,但我检索了两张 vCard,一张用于联系人,一张用于组。组 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/

联系名片:

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;

团体电子名片:

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 的内容?

4

1 回答 1

8

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

什么是群。组是联系人的集合。Addressbook.app 使用一个特殊的组 vCard 来表示这种关系。这个“组 vCard”通过 X-ADDRESSBOOKSERVER-MEMBER 属性引用了它的成员。它包含应该是该组成员的联系人 vCard(或其他组 vCard)的 UID。在 vCard 3 中——这是大多数 CardDAV 基础设施所使用的——这是苹果特有的(因此是 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

说得通?

不要被出口的类别黑客所迷惑。这不是小组的工作方式。

于 2014-06-13T23:40:19.690 回答