在iPhone中创建电子名片

问题描述:

我正尝试在iPhone中创建电子名片。我为vCard创建了一个字符串表示。我不知道如何将其转换为NSData格式,以便将它作为附件发送。这是我到目前为止有:在iPhone中创建电子名片

 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

你已经得到所有联系人在一张v卡???如果是的话,请帮助我如何得到它,并制作一个v卡。 – parag

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

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

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

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

更新2:我急着要完成一个应用程序,但因为我确实想创建vCard数据并将它作为附件添加到几个地方的应用程序内邮件中,所以我现在创建了一个单独的类控制器使/隐藏vCard语法的细节。然后我只是有一个方法返回一个NSData版本的vCard字符串,作为附件直接添加到邮件消息中。这是一个更清洁的解决方案,即使它们只是临时的,也不需要创建任何文件。另外,你不需要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来积聚的数据地址,其中必须包括;即使对于可选地址字段也是如此

+0

你好nikunj已经得到所有联系人在一个v卡???如果是的话,请帮助我如何得到它,并制作一个v卡。 – parag