完全同意 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 的方法来构建地址数据,其中必须包含 ;即使是可选的地址字段也是分隔符。