从AddressBook.framework生成vCard

Oli*_*ver 14 iphone cocoa cocoa-touch vcf-vcard addressbook

我在我的iPhone应用程序中使用了AddressBook.framework,我想在Contacts.app中按照共享功能的方式复制一些内容.这基本上是将特定联系人vCard附加到电子邮件中.据我所知,文档中没有提到生成vCard的内容.

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

pet*_*ert 19

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

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

Objective-c类别或简单框架将是一个很大的帮助 - 我可能会在时间上做到这一点.

维基百科页面和正规规范电子名片(3.0)真正的帮助.

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

CFDataRef ABPersonCreateVCardRepresentationWithPeople(CFArrayRef people);
Run Code Online (Sandbox Code Playgroud)

更新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;
}
Run Code Online (Sandbox Code Playgroud)

显然我正在引用我的类中的属性,以及一个调用-addressWithSeparator地址数据的方法,该方法必须包含; 甚至是可选地址字段的分隔符.


Dav*_*ong 6

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

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

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


alt*_*osh 5

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