2011-09-08 28 views
2

我正嘗試在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

回答

1

完全同意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