Фреймворк AB иногда может быть настоящей болью. Но это разбивается на ряд довольно простых операций. Сначала вам нужно создать экземпляр ABAddressBook:
ABAddressBookRef addressbook = ABAddressBookCreate();
Затем вы захотите сделать копию массива всех людей в адресной книге и пошагово просмотреть их в поисках нужных вам данных:
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressbook);
CFIndex numPeople = ABAddressBookGetPersonCount(addressbook);
for (int i=0; i < numPeople; i++) {
Внутри вашего цикла вы, вероятно, захотите получить ссылку на отдельного человека:
ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
Затем вы хотите сравнить свой номер (давайте позвоним по этому номеру inNumber
) с каждым номером телефона, связанным с этим конкретным человеком. Для этого вам сначала необходим список всех телефонных номеров этого человека:
ABMutableMultiValueRef phonelist = ABRecordCopyValue(person, kABPersonPhoneProperty);
Тогда, конечно, вам потребуется внутренняя петля, которая зацикливается на каждом из телефонных номеров каждого человека:
CFIndex numPhones = ABMultiValueGetCount(phones);
for (int j=0; j < numPhones; j++) {
Поскольку с номерами телефонов связаны номера и метки, вам необходимо извлечь строку фактического номера телефона в виде строки NSS:
CFTypeRef ABphone = ABMultiValueCopyValueAtIndex(phoneList, j);
NSString *personPhone = (NSString *)ABphone;
CFRelease(ABphone);
Теперь вы можете, наконец, сравнить цифры! Сделайте это с помощью стандартных методов сравнения NSString, но помните, что вам нужно беспокоиться о форматировании и т. Д.
Как только вы найдете человека, у которого номер телефона соответствует inNumber
, вы захотите извлечь изображение этого человека в UIImage
:
CFDataRef imageData = ABPersonCopyImageData(person);
UIImage *image = [UIImage imageWithData:(NSData *)imageData];
CFRelease(imageData);
Когда придет время выходить, вам нужно почистить память. Общее практическое правило для инфраструктуры AB заключается в том, что все, что с Get
в имени функции не нужно выпускать, и все, что с Copy
или Create
, вам нужно освобождать. Таким образом, в этом случае вам потребуется CFRelease()
phonelist
, allPeople
и addressbook
, но не numPeople
, person
или numPhones
.