2010-05-08 33 views
13

我在我的iPhone應用程序中使用AddressBook.framework,並且想要在Contacts.app中沿着共享功能的行復制某些內容。這基本上附加了一個特定的聯繫人電子名片到電子郵件。據我所知,在文檔中沒有提到生成電子名片。從AddressBook.framework生成電子名片

這是自己生成一個案例嗎?或者有什麼可以幫助我嗎?

+2

另請參閱:http://stackoverflow.com/questions/1552325不幸的是,這個問題沒有被接受的答案。 – 2010-05-08 21:33:58

回答

18

完全同意Dave DeLong的回答。只是想補充一點,因爲我只是想創建一個vCard文件(.vcf)並將其附加到應用內電子郵件操作中,我所做的是創建一個字符串,然後是一個臨時文件,包含所有vCard字段, 。

在我的情況下,我在我的NSManagedObject子類中做了一個方法,返回一個-vCardRepresentation字符串。

一個Objective-c類或簡單的框架將是一個很大的幫助 - 我可能會做的時候。

Wikipedia頁面和vCard(3.0)的正式規範確實有幫助。

更新3:如果你使用的是iOS 5或更高版本現在有在ABPerson功能,可以返回的特定的人記錄的電子名片表示:

CFDataRef ABPersonCreateVCardRepresentationWithPeople(CFArrayRef people); 

更新2:我爲了獲得一個完整的應用程序,但因爲我確實想創建vCard數據並將它作爲附件添加到多個地方的應用內郵件中,所以我現在已經創建了一個單獨的類控制器,它可以創建/隱藏vCard語法的詳細信息。然後我只是有一個方法返回一個NSData版本的vCard字符串,作爲附件直接添加到郵件消息中。這是一個更清潔的解決方案,即使它們只是臨時的,也不需要創建任何文件。另外,你不需要NSString表示數據,除非你想創建一個文件並多次使用它來保存重新生成的數據嗎?

我的控制器類有多個-setXXXX方法,它們將值添加到字典中的密鑰是帶有vCard字段名稱的字符串,如FN,TEL和ADR。然後,當我調用它的-vCardRepresentation時,它現在會返回一個NSData對象(通過掃描字典構建),該對象可以直接在MFMailComposeViewController的方法-addAttachmentData:mimeType:fileName:中使用。

如果我可以整理我的代碼,那麼它足夠通用,我會稍後發佈。

UPDATE:這裏是我的代碼,它可能會幫助別人上手:

- (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

謝謝!看起來像一個真棒的開始。 – Oliver 2010-06-08 17:50:55

+0

尚未完全測試,但在導入vCard文件時,看起來GEO字段未在Mac的AddressBook應用中使用?它在AddressBook的註釋字段中添加了如下內容:「GEO:51.34i8rtt」。 – petert 2010-06-09 07:51:47

+1

這是一個很好的幫助。附加NSData時使用了哪種MIME類型?維基百科說:「注意:在某些SyncML文檔中使用了互聯網媒體類型文本/電子名片(不正確)來引用vCard 3.0,並且在各種實現中遵循了該示例。」 – Oliver 2010-06-09 13:03:07

5

似乎沒有任何公開發布的代碼來執行此操作。 AddressBook.framework的Mac版本確實有ABPersonCopyVCardRepresentation(),但iPhone上沒有相應的版本。

也許你最好的選擇是採取現有的解析器/構建器(例如PEAR builderparser)並將它們轉換爲Objective-C。

另一種選擇可能是編寫自己的構建器。 vCards的語法並不困難。

5

Here您可以下載生成vCard的代碼。

+0

請使用該代碼提供一些示例應用程序。提前致謝。 – 2014-01-06 11:39:28