【问题标题】:Creating a vCard in iPhone在 iPhone 中创建电子名片
【发布时间】:2011-09-08 06:57:48
【问题描述】:

我正在尝试在 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"];

【问题讨论】:

  • 您已经在一张 v 卡中获得了所有联系人???如果是,请帮助我如何获取它并制作 v 卡。

标签: iphone vcf-vcard


【解决方案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 的方法来构建地址数据,该地址必须包含 ;即使是可选的地址字段也是分隔符。

【讨论】:

  • 你好 nikunj 已经在一张 v 卡中获得了所有联系 ???如果是,请帮助我如何获得它并制作 v 卡。
猜你喜欢
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
相关资源
最近更新 更多