【问题标题】:Manipulate groups in iCloud with CardDAV protocol使用 CardDAV 协议在 iCloud 中操作组
【发布时间】:2014-06-13 09:53:58
【问题描述】:

我目前正在尝试通过 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 属性,但我检索了两张 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/

联系 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;

组电子名片:

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

【问题讨论】:

  • 也许你应该调整标题,vCard 组是不同的。您正在询问类别。我不知道“iContact”,它如何与 iCloud 集成?据推测,它将类别保留在客户端本地,而不是将它们上传到 iCloud 服务器。还是您在谈论 MacOS Contacts.app?请提供更多背景信息。
  • 感谢您的评论。我详细说明了上下文和我的要求。你说vCard联系人和vCard组不同,在什么方面?使用 CardDav 处理组的标准方法是什么?

标签: icloud vcf-vcard carddav


【解决方案1】:

好的。让我们从头开始。什么是 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

有道理吗?

不要被导出的类别破解所迷惑。这不是小组的工作方式。

【讨论】:

  • 是的,它帮助了我。我对联系人应用程序中的 vCard 和旧式请求中的 vCard 之间的区别感到有些困惑。我还测试了组成员添加/删除,它工作正常。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-06-10
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多