从 AddressBook.framework 生成 vCard

Posted

技术标签:

【中文标题】从 AddressBook.framework 生成 vCard【英文标题】:Generate vCard from AddressBook.framework 【发布时间】:2011-02-17 05:54:04 【问题描述】:

我在我的 iPhone 应用程序中使用 AddressBook.framework,我想复制一些与 Contacts.app 中的共享功能类似的东西。这基本上将特定的联系人电子名片附加到电子邮件中。据我所知,文档中没有提到生成 vCard。

这是自己生成的情况吗?或者有什么可以帮助我的吗?

【问题讨论】:

另请参阅:***.com/questions/1552325 不幸的是,这个问题没有被接受的答案。 【参考方案1】:

完全同意 Dave DeLong 的回答。只是想补充一点,因为我只是想创建一个 vCard 文件 (.vcf) 并将其附加到应用内电子邮件操作中,我所做的是创建一个字符串,然后是一个临时文件,其中包含我拥有的所有 vCard 字段的数据.

在我的例子中,我在 NSManagedObject 子类中创建了一个方法来返回 -vCardRepresentation 字符串。

Objective-c 类别或简单的框架会很有帮助 - 到时候我可能会这样做。

Wikipedia 页面和vCard (3.0) 的正式规范确实很有帮助。

更新 3:如果您使用的是 ios 5 或更高版本,ABPerson 中现在有一个函数可以返回给定人员记录的 vCard 表示:

CFDataRef ABPersonCreateVCardRepresentationWithPeople(CFArrayRef people);

更新 2:我急于完成一个应用程序,但因为我确实想创建 vCard 数据并将其作为附件添加到我现在在几个地方的应用程序内邮件消息中制作了一个单独的类控制器,用于制作/隐藏 vCard 语法的细节。然后我只有一个方法,它返回 vCard 字符串的 NSData 版本,以作为附件直接添加到邮件中。这是一个更简洁的解决方案,您不需要创建任何文件,即使它们只是临时的。另外,您实际上并不需要数据的 NSString 表示,除非您确实想创建一个文件并多次使用它来节省重新制作数据?

我的控制器类有许多 -setXXXX 方法,这些方法可以将值添加到字典中,其中键是带有 vCard 字段名称的字符串,例如 FN、TEL 和 ADR。然后当我调用它的-vCardRepresentation 时,它现在返回一个NSData 对象(通过扫描字典构建),可以直接在MFMailComposeViewController 的-addAttachmentData:mimeType:fileName: 方法中使用。

如果我可以整理我的代码,使其足够通用,我会稍后发布。

更新:这是我的代码,它可能会帮助某人入门:

- (NSString *)vCardRepresentation

  NSMutableArray *mutableArray = [[NSMutableArray alloc] init];

  [mutableArray addObject:@"BEGIN:VCARD"];
  [mutableArray addObject:@"VERSION:3.0"];

  [mutableArray addObject:[NSString stringWithFormat:@"FN:%@", self.name]];

  [mutableArray addObject:[NSString stringWithFormat:@"ADR:;;%@",
                           [self addressWithSeparator:@";"]]];

  if (self.phone != nil)
    [mutableArray addObject:[NSString stringWithFormat:@"TEL:%@", self.phone]];

  [mutableArray addObject:[NSString stringWithFormat:@"GEO:%g;%g",
                           self.latitudeValue, self.longitudeValue]];

  [mutableArray addObject:[NSString stringWithFormat:@"URL:http://%@",
                           self.website]];

  [mutableArray addObject:@"END:VCARD"];

  NSString *string = [mutableArray componentsJoinedByString:@"\n"];

  [mutableArray release];

  return string;

显然我在我的类中引用属性,加上一个名为-addressWithSeparator 的方法来构建地址数据,其中必须包含 ;即使是可选的地址字段也是分隔符。

【讨论】:

非常感谢!看起来是一个很棒的开始。 尚未对此进行全面测试,但在导入 vCard 文件时,Mac 的 AddressBook 应用程序中似乎没有使用 GEO 字段?它在地址簿的注释字段中添加了如下内容:“GEO:51.34i8rtt”。 这是一个很大的帮助。您在附加 NSData 时使用了哪种 MIME 类型?***说“注意:在一些 SyncML 文档中(错误地)使用 Internet 媒体类型 text/vcard 来引用 vCard 3.0,并且在各种实现中都遵循了该示例。”。 我实际上需要检查哪些 MIME 类型(在此处列出:en.wikipedia.org/wiki/VCard)在我实际发送附件并在类似地址簿应用程序中打开它时工作。我从“text/x-card”开始。从模拟器发送消息不起作用,很遗憾。 我目前正在使用“application/vnd.groove-vcard”。我还没有测试过,但至少是官方的。【参考方案2】:

似乎没有任何公开发布的代码来执行此操作。 Mac 版本的 AddressBook.framework 确实有一个ABPersonCopyVCardRepresentation(),但在 iPhone 上没有对应的。

您最好的选择可能是采用现有的解析器/构建器(例如 PEAR builder 和 parser)并将它们转换为 Objective-C。

另一种选择可能是编写自己的构建器。 vCard 的语法并不难。

【讨论】:

【参考方案3】:

Here 你可以下载生成vCard的代码。

【讨论】:

请提供一些使用该代码的示例应用程序。提前致谢。

以上是关于从 AddressBook.framework 生成 vCard的主要内容,如果未能解决你的问题,请参考以下文章

Iphone AddressBook Framework - 人物属性

将条目添加到AddressBook iPhone

iOS开发之系统通讯录

通讯录

iOS学习笔记29-系统服务通讯录

通讯录