从AddressBook.framework生成电子名片

问题描述:

我在我的iPhone应用程序中使用AddressBook.framework,并且想要在Contacts.app中沿着共享功能的行复制某些内容。这基本上附加了一个特定的联系人电子名片到电子邮件。据我所知,在文档中没有提到生成电子名片。从AddressBook.framework生成电子名片

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

+2

另请参阅:http://*.com/questions/1552325不幸的是,这个问题没有被接受的答案。 – 2010-05-08 21:33:58

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

在我的情况下,我在我的NSManagedObject子类中做了一个方法,返回一个-vCardRepresentation字符串。

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

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

更新3:如果你使用的是iOS 5或更高版本现在有在ABPerson功能,可以返回的特定的人记录的电子名片表示:

CFDataRef ABPersonCreateVCardRepresentationWithPeople(CFArrayRef people); 

更新2:我为了获得一个完整的应用程序,但因为我确实想创建vCard数据并将它作为附件添加到多个地方的应用内邮件中,所以我现在已经创建了一个单独的类控制器,它可以创建/隐藏vCard语法的详细信息。然后我只是有一个方法返回一个NSData版本的vCard字符串,作为附件直接添加到邮件消息中。这是一个更清洁的解决方案,即使它们只是临时的,也不需要创建任何文件。另外,你不需要NSString表示数据,除非你想创建一个文件并多次使用它来保存重新生成的数据吗?

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

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

UPDATE:这里是我的代码,它可能会帮助别人上手:

- (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的方法来积聚的数据地址,其中必须包括;即使对于可选地址字段也是如此

+0

谢谢!看起来像一个真棒的开始。 – Oliver 2010-06-08 17:50:55

+0

尚未完全测试,但在导入vCard文件时,看起来GEO字段未在Mac的AddressBook应用中使用?它在AddressBook的注释字段中添加了如下内容:“GEO:51.34i8rtt”。 – petert 2010-06-09 07:51:47

+1

这是一个很好的帮助。附加NSData时使用了哪种MIME类型?*说:“注意:在某些SyncML文档中使用了互联网媒体类型文本/电子名片(不正确)来引用vCard 3.0,并且在各种实现中遵循了该示例。” – Oliver 2010-06-09 13:03:07

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

也许你最好的选择是采取现有的解析器/构建器(例如PEAR builderparser)并将它们转换为Objective-C。

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

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

+0

请使用该代码提供一些示例应用程序。提前致谢。 – 2014-01-06 11:39:28