Не могу прочитать kABPersonPhoneProperty - PullRequest
3 голосов
/ 25 декабря 2011

Я сталкиваюсь с (странной) проблемой: я хотел бы узнать количество телефонных номеров контакта, но по какой-то причине я не могу.

Я использовал

ABAddressBookRef addressBook = ABAddressBookCreate();
NSArray *contacts = (NSArray*) ABAddressBookCopyArrayOfAllPeople(addressBook);
CFRelease(addressBook);

, чтобы получить массив всех контактов.Тогда я хотел бы использовать

ABMultiValueRef ref = ABRecordCopyValue([contacts objectAtIndex:i], kABPersonPhoneProperty);

NSLog(@"%d",ref==NULL);

, но ABRecordCopyValue всегда возвращает nil ...
Обратите внимание, что я могу получить другую информацию о контакте: например, извлекая имяотлично работает, используя

CFStringRef name = ABRecordCopyCompositeName([contacts objectAtIndex:i]);


Может кто-нибудь объяснить мне, что я делаю неправильно?Я использую Snow Leopard с Xcode 4.2 и разрабатываю для iOS 4.0 ...

РЕДАКТИРОВАТЬ: я нашел решение: вместо использования

ABRecordCopyValue([contacts objectAtIndex:i], kABPersonPhoneProperty);

я использовал

ABRecordID idRec = ABRecordGetRecordID([contacts objectAtIndex:i]);
ABMultiValueRef ref = ABRecordCopyValue(ABAddressBookGetPersonWithRecordID(addressBook, idRec), kABPersonPhoneProperty);

Однако я должен был сохранить ссылку на addressBook (не выпускать ее), поэтому решение, предложенное EricS, кажется лучше.

1 Ответ

17 голосов
/ 26 декабря 2011

Это всего лишь предположение, но я бы постарался оставить адресную книгу открытой, пока вы не закончите читать из нее.То есть, не звоните CFRelease(addressBook);, пока не прочитаете все номера телефонов.

Адресная книга больше похожа на базу данных, чем на простой файл, и чтение в записи контакта дает вам ссылки на другие поля и данные, а не на весь фактический контент поля.

...