我正在尝试在iPhone中创建vCard表示。我为vCard创建了一个字符串表示。我不知道如何将其转换为NSData表单,以便将其作为附件邮寄。这就是我到目前为止所做的:
NSString *vCardString = [vCard getVCFString]; // returns string representation for vCard
NSData *vCardData = [vCardString dataUsingEncoding:NSUTF8StringEncoding];
[mailController addAttachmentData:vCardData mimeType:@"text/x-vcard" fileName:@"LocationInfo"];
当我在执行测试电子邮件时单击附件时,它会转到创建新联系人/添加为现有联系人。这是正确的,因为iPhone将其识别为联系人吗?我想我有兴趣从中获取位置信息,但这似乎没有出现在我的附件中。创建我的VCF表示的代码是:
vcfString = [[NSMutableString allocWithZone:[self zone]] initWithCapacity:kDefaultStringSize];
[vcfString appendString:@"BEGIN:VCARD\n"];
[vcfString appendString:@"VERSION:3.0\n"];
if (s) {
NSMutableString *aString = [[NSMutableString alloc] initWithFormat:@"%@;", s];
[vcfString appendString:aString];
[aString replaceOccurrencesOfString:@";" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [aString length])];
street = [[NSString allocWithZone:[self zone]] initWithString:aString];
[aString release];
}
if (c) {
NSMutableString *aString = [[NSMutableString alloc] initWithFormat:@"%@;", c];
[vcfString appendString:aString];
[aString replaceOccurrencesOfString:@";" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [aString length])];
city = [[NSString allocWithZone:[self zone]] initWithString:aString];
[aString release];
}
if (st) {
NSMutableString *aString = [[NSMutableString alloc] initWithFormat:@"%@;", st];
[vcfString appendString:aString];
[aString replaceOccurrencesOfString:@";" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [aString length])];
state = [[NSString allocWithZone:[self zone]] initWithString:aString];
[aString release];
}
// TODO: look up semicolon for VCard representation
if (z) {
NSString *aString = [[NSString alloc] initWithFormat:@"%@\n", z];
[vcfString appendString:aString];
zip = [[NSString allocWithZone:[self zone]] initWithString:aString];
[aString release];
}
[vcfString appendString:@"END:VCARD"];
答案 0 :(得分:1)
完全同意Dave DeLong的回答。只想添加,因为我只是想创建一个vCard文件(.vcf)并将其附加到应用内电子邮件操作,我所做的是创建一个字符串,然后是一个临时文件,包含我拥有的所有vCard字段数据
在我的情况下,我在NSManagedObject子类中创建了一个方法来返回-vCardRepresentation字符串。
Objective-c类别或简单框架将是一个很大的帮助 - 我可能会在时间上这样做。
Wikipedia页面和vCard(3.0)的正式规范确实有帮助。
更新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的方法来构建地址的数据,该地址必须包含;甚至是可选的地址字段的分隔符。