以编程方式备份​​完整的iPhone AddressBook

Boe*_*ger 1 iphone xcode objective-c ios

我需要以编程方式备份​​所有记录(数字,名称,图像......)的所有联系人.我读到了关于AddressBook.framework的内容,但有一种简单的方法来备份所有联系人吗?

ein*_*not 6

1.这样做的一种方法是创建一个包含所有联系人的vCard字符串.像这样:

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

并将此字符串写入文件进行备份.

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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

这种方法的一个问题是我不知道维持联系人链接的方式(交换,Facebook ......).