Полное резервное копирование адресной книги iPhone программно

Мне нужно сделать резервную копию всех контактов со всеми записями (номера, имена, изображения, ...) программно. Я читал о AddressBook.framework, но есть ли простой способ сделать резервную копию всех контактов?

 Boeringer28 июн. 2012 г., 16:55
это необходимо для моей идеи приложения ... данные будут храниться только локально. почему это должно быть проблемой?
 esqew28 июн. 2012 г., 13:28
Да уж. Подключите ваш iPhone к iTunes и сделайте резервную копию. Любая конкретная причина, по которой вам нужен пользовательentire база контактов? В недавнем прошлом было несколько крупных приложений, которые попали в беду из-за этого.

Ответы на вопрос(2)

1.онтактами. Как это:

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);

Проблема с этим подходом заключается в том, что я не знаю, как сохранить связь между контактами (exchange, facebook ...).

какие свойства контактов вы хотите сделать резервную копию. Если вы хотите сделать резервную копию их имен и фамилий, сделайте что-то вроде этого:

//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];

Если у вас есть какие-либо вопросы по поводу кода, просто спросите в комментариях. Надеюсь это поможет!

 Boeringer28 июн. 2012 г., 16:53
спасибо за код! но я хочу сделать резервную копию ВСЕХ записей контакта ... я думаю, что есть функция, которая просто создает дамп всей адресной книги.
 28 июн. 2012 г., 17:20
@ Boeringer Я просмотрел ссылки на классы классов в структуре адресной книги, и похоже, что это не функция для этого. Однако вы можете создать NSMutableArray для каждой записи контакта, но это будет утомительно.

Ваш ответ на вопрос