14

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

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

4

3 回答 3

18

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

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

一个 Objective-c 类别或简单的框架将是一个很大的帮助 - 我可能会在适当的时候这样做。

维基百科页面和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来构建地址数据的方法,该方法必须包含 ; 即使是可选地址字段的分隔符。

于 2010-06-08T10:01:47.073 回答
6

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

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

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

于 2010-05-08T21:39:40.830 回答
5

在这里您可以下载生成 vCard 的代码。

于 2011-01-21T13:50:28.323 回答