1

アドレス帳のすべての内容に対して 1 つの Vcf ファイルを作成したいと考えています。現在、1 つの連絡先に対して 1 つの vcf ファイルを作成しています。アドレス帳のすべての連絡先に対して 1 つの vcf ファイルを作成する方法がわかりません。単一の vcf ファイルを作成するために次のコードを使用しています。単一の vcf ファイルを返します。+ (NSString *)generateVCardStringWithRec:(ABRecordRef)rec { [VCard setItemCounter:0];

//
ABContact *contact = [ABContact contactWithRecord:rec];

//
NSString *vcard = @"BEGIN:VCARD\nVERSION:3.0\n";

// Name
vcard = [vcard stringByAppendingFormat:@"N:%@;%@;%@;%@;%@\n",
         (contact.lastname ? contact.lastname : @""),
         (contact.firstname ? contact.firstname : @""),
         (contact.middlename ? contact.middlename : @""),
         (contact.prefix ? contact.prefix : @""),
         (contact.suffix ? contact.suffix : @"")
         ];

vcard = [vcard stringByAppendingFormat:@"FN:%@\n",contact.compositeName];
if(  contact.nickname ) vcard = [vcard stringByAppendingFormat:@"NICKNAME:%@\n",contact.nickname];
if(  contact.firstnamephonetic ) vcard = [vcard stringByAppendingFormat:@"X-PHONETIC-FIRST-NAME:%@\n",contact.firstnamephonetic];
if(  contact.lastnamephonetic ) vcard = [vcard stringByAppendingFormat:@"X-PHONETIC-LAST-NAME:%@\n",contact.lastnamephonetic];


// Work
if( contact.organization || contact.department ) vcard = [vcard stringByAppendingFormat:@"ORG:%@;%@\n",(contact.organization?contact.organization:@""),(contact.department?contact.department:@"")];
if( contact.jobtitle ) vcard = [vcard stringByAppendingFormat:@"TITLE:%@\n",contact.jobtitle];


// Mail
vcard = [vcard stringByAppendingString:[VCard toVcardField:@"email" items:contact.emailArray labels:contact.emailLabels]];

// Tel
vcard = [vcard stringByAppendingString:[VCard toVcardField:@"phone" items:contact.phoneArray labels:contact.phoneLabels]];

// Adress
vcard = [vcard stringByAppendingString:[VCard toVcardField:@"address" items:contact.addressArray labels:contact.addressLabels]];

// url
vcard = [vcard stringByAppendingString:[VCard toVcardField:@"url" items:contact.urlArray labels:contact.urlLabels]];

// IM
vcard = [vcard stringByAppendingString:[VCard toVcardField:@"im" items:contact.smsArray labels:contact.smsLabels]];

// birthday
NSDate *birthday = contact.birthday;
if (birthday)
{
    NSString *bday = [NSString stringWithFormat:@"%@",birthday];
    NSArray *bdayArr = [bday componentsSeparatedByString:@" "];
    bday = [bdayArr objectAtIndex:0];

    vcard = [vcard stringByAppendingFormat:@"BDAY;value=date:%@\n",bday];
}

// Photo
NSData *imageData = contact.thumbData;//contact.imageData;
if (imageData)
{
    vcard = [vcard stringByAppendingFormat:@"PHOTO;BASE64:%@\n",[imageData base64Encoding]];
}

// end
vcard = [vcard stringByAppendingString:@"END:VCARD"];

return vcard;

}`

4

2 に答える 2

2

今はとてもシンプル

 ABAddressBookRef addressBook = ABAddressBookCreate();
ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(addressBook);
//----------------------------------------------- create vcf file------------------------------------------
CFArrayRef contacts = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFDataRef vcards = (CFDataRef)ABPersonCreateVCardRepresentationWithPeople(contacts);
NSString *vcardString = [[NSString alloc] initWithData:(NSData *)vcards encoding:NSUTF8StringEncoding];
NSError *error;
NSFileManager *fileMgr = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *folderPath = [paths objectAtIndex:0];
NSString *filePath = [folderPath stringByAppendingPathComponent:@"contacts.vcf"];
[vcardString writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSLog(@"Documents directory: %@",[fileMgr contentsOfDirectoryAtPath: folderPath error:&error]);
//----------------------------------------------- create vcf file------------------------------------------
于 2013-07-05T12:10:10.000 に答える
0

この質問が古いことは知っていますが... 複数の連絡先を単一の vcf ファイルに入れるには、ファイルの新しい行から次の連絡先を出力するだけです。各連絡先が「BEGIN:VCARD」と「END:VCARD」の間であれば問題ありません。

于 2013-01-28T13:59:30.150 に答える