1

プログラムですべての連絡先をすべてのレコード (番号、名前、画像など) でバックアップする必要があります。AddressBook.framework について読みましたが、すべての連絡先をバックアップする簡単な方法はありますか?

4

2 に答える 2

6

1.これを行う 1 つの方法は、すべての連絡先を含む vCard 文字列を作成することです。このような:

ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef peopleForBackup  = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFDataRef vcards = (CFDataRef)ABPersonCreateVCardRepresentationWithPeople(peopleForBackup);
vcardString = [[NSString alloc] initWithData:(NSData *)vcards encoding:NSUTF8StringEncoding];

そして、この文字列をバックアップ用のファイルに書き込みます。

2.アドレス帳から現在の連絡先を削除します。

ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);
int arrayCount = CFArrayGetCount(people);
ABRecordRef abrecord;

for (int i = 0; i < arrayCount; i++) {
    abrecord = CFArrayGetValueAtIndex(people, i);
    ABAddressBookRemoveRecord(addressBook,abrecord, NULL);
}
CFRelease(people);

3. バックアップから復元するには、vcard ファイルを文字列に読み込み、vcard 内の個人レコードを繰り返し処理し、レコードとしてアドレス帳に追加してから保存します。

ABAddressBookRef addressBook = ABAddressBookCreate();
NSData *stringData = [NSData dataWithContentsOfFile:contactFilePath];
NSString *vcardFromFile = [[NSString alloc] initWithData:stringData encoding:NSUTF8StringEncoding];

CFDataRef vCardData = (CFDataRef)[vcardFromFile dataUsingEncoding:NSUTF8StringEncoding];

ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(addressBook);
CFArrayRef vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource, vCardData);

for (CFIndex index = 0; index < CFArrayGetCount(vCardPeople); index++) {
    ABRecordRef person = CFArrayGetValueAtIndex(vCardPeople, index);
    ABAddressBookAddRecord(addressBook, person, NULL);
    CFRelease(person);
}

CFRelease(vCardPeople);
CFRelease(defaultSource);
bool success = ABAddressBookSave(addressBook, NULL);

このアプローチの問題は、連絡先 (交換、Facebook など) のリンクを維持する方法がわからないことです。

于 2013-01-25T08:39:47.720 に答える
0

バックアップする連絡先のプロパティによって異なります。名前と姓をバックアップしたい場合は、次のようにします。

//CREATE ARRAYS STORING FIRST NAMES AND LAST NAMES
NSMutableArray *firstNames = [[NSMutableArray alloc] init];
NSMutableArray *lastNames = [[NSMutableArray alloc] init];

ABAddressBookRef addressBook = ABAddressBookCreate();
NSArray *arrayOfPeople = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
CFRelease(addressBook);

for(NSUInteger index = 0; index <= ([arrayOfPeople count]-1); index++){

    ABRecordRef currentPerson = (__bridge ABRecordRef)[arrayOfPeople objectAtIndex: index];
    [firstNames addObject: (__bridge_transfer NSString *)ABRecordCopyValue(currentPerson, kABPersonFirstNameProperty)];
    [lastNames addObject: (__bridge_transfer NSString *)ABRecordCopyValue(currentPerson, kABPersonLastNameProperty)];        
}

//BACKUP THE ARRAYS IN A PLIST 
NSArray *array=[NSArray arrayWithObjects: firstNames, lastNames, nil];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *location = [[paths objectAtIndex:0] stringByAppendingString:@"/somefilename.plist"];
[array writeToFile:location atomically:YES];

コードについて質問がある場合は、コメントで質問してください。お役に立てれば!

于 2012-06-28T14:22:13.157 に答える